文档章节

Java学习日志(12-2-多线程相关操作)

Almon
 Almon
发布于 2016/08/16 15:41
字数 714
阅读 5
收藏 0

停止线程

    run方法结束

    开启多线程运行,代码通常是循环结构,只要控制循环,就可以让线程结束

class StopThread implements Runnable{
	private boolean flag=true;
	public void run(){
		while(flag){
			System.out.println(Thread.currentThread().getName()+"___Run");
		}
	}
	public void changeFlag(){
		flag=false;
	}
}
class StopThreadDemo{
	public static void main(String[] args){
		StopThread st=new StopThread();
		Thread t1=new Thread(st);
		Thread t2=new Thread(st);
		t1.start();
		t2.start();
		
		int num=0;
		while(flag){
			if(num++==60){
				st.changeFlag();
				break;
			}
			System.out.println(Thread.currentThread().getName()+"___"+num);
		}
	}
}

特殊情况:

    当线程处于冻结状态,就不会读取到标记,进而线程也不会结束

    使用interrupt()命令强制中断

//运行结果:报告异常

class StopThread implements Runnable{
	private boolean flag=true;
	public synchronized void run(){
		while(flag){
			try{
				wait();
			}
			catch(InterruptedException e){
				System.out.println(Thread.currentThread().getName()+"___Exception");
			}
			System.out.println(Thread.currentThread().getName()+"___Run");
		}
	}
	public void changeFlag(){
		flag=false;
	}
}
class StopThreadDemo{
	public static void main(String[] args){
		StopThread st=new StopThread();
		Thread t1=new Thread(st);
		Thread t2=new Thread(st);
		t1.start();
		t2.start();
		
		int num=0;
		while(true){
			if(num++==60){
				t1.interrupt();
				t2.interrupt();
				//st.changeFlag();
				break;
			}
			System.out.println(Thread.currentThread().getName()+"___"+num);
		}
	}
}

处理异常

catch(InterruptedException e){
				System.out.println(Thread.currentThread().getName()+"___Exception");
				flag=false;
			}

    当没有指定的方式让冻结的线程恢复到运行状态时,需要对冻结进行清除

    强制让线程恢复运行,这样就可以操作flag让线程结束

    该方法在Thread类中为interrupt().

守护线程

//运行结果为当Num=60时自动结束

class StopThread implements Runnable{
	private boolean flag=true;
	public synchronized void run(){
			System.out.println(Thread.currentThread().getName()+"___Run");
		}
	}
	public void changeFlag(){
		flag=false;
	}
}
class StopThreadDemo{
	public static void main(String[] args){
		StopThread st=new StopThread();
		Thread t1=new Thread(st);
		Thread t2=new Thread(st);
		t1.setDaemon(true);
		t2.setDaemon(true);
		t1.start();
		t2.start();
		
		int num=0;
		while(true){
			if(num++==60){
				break;
			}
			System.out.println(Thread.currentThread().getName()+"___"+num);
		}
		System.out.println("Over");
	}
}

    在启动前调用,当正在运行的线程只有守护线程时,Jvm退出

Join方法

//运行结果为t1运行完后main和t2争夺执行权,交替完成

class jDemo implements Runnable{
	public void run(){
		for(int x=0;x<70;x++){
			System.out.println(Thread.currentThread().getName()+"___"+x);
		}
	}
}
class JoinDemo{
	public static void main(String[] args)throws Exception{
		jDemo d=new jDemo();
		Thread t1=new Thread(d);
		Thread t2=new Thread(d);
		t1.start();
		t1.join();//t1申请执行权
		t2.start();
		for(int x=0;x<80;x++){
			System.out.println("main___"+x);
		}
		System.out.println("Over");
	}
}

t1,t2交替执行 主线程等待t1运行结束后再有控制权

		t1.start();
		t2.start();
		t1.join();

特点:

    当A线程执行到了B线程的join方法时,A就会等待至B线程执行完再运行

    用于临时加入线程执行

优先级

    有1-10个等级,优先级越高执行权越大

		t1.setPriority(Thread.MAX_PRIORITY);

yield方法:暂停该线程转而执行其它线程

class jDemo implements Runnable{
	public void run(){
		for(int x=0;x<70;x++){
			System.out.println(Thread.currentThread().getName()+"___"+x);
			Thread.yield();//暂停该线程
		}
	}
}

开发中多线程常用写法

class ThreadTest{
	public static void main(String[] args){
		new Thread(){
			public void run(){
				for(int x=0;x<100;x++){
					System.out.println(Thread.currentThread().getName()+"___"+x);
				}				
			}
		}.start();
		
		for(int x=0;x<100;x++){
			System.out.println(Thread.currentThread().getName()+"___"+x);
		}
		
		Runnable r=new Runnable(){
			public void run(){
				for(int x=0;x<100;x++){
					System.out.println(Thread.currentThread().getName()+"___"+x);
				}		
			}
		};
		new Thread(r).start();
	}
}

 

© 著作权归作者所有

共有 人打赏支持
Almon
粉丝 2
博文 64
码字总数 44346
作品 0
江北
私信 提问
Java面试需要准备哪些多线程并发的技术要点

一、概念 什么是线程 一个线程要执行任务,必须得有线程 一个进程(程序)的所有任务都在线程中执行的 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务 多线程原理 同一...

码蚁说架构
05/31
0
0
Java多线程学习(四)等待/通知(wait/notify)机制

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
04/16
0
0
cxxJava -- 像Java一样开发C++

cxxJava -- 像Java一样开发C++ 当你同时有过java和c++两个语言的开发经历后,你会喜欢上java语言开发效率的高效但又深深的被c++语言运行效率的高效所吸引。 java类库的丰富性、通用性、易用性...

cxxjava
2016/12/12
169
0
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
08/08
0
0
给Java新手的一些建议——Java知识点归纳(Java基础部分)

  写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,...

Java工程师-10
2017/05/24
509
2

没有更多内容

加载失败,请刷新页面

加载更多

快速开发android,离不开这10个优秀的开源项目

作为一名菜鸡Android,时常瞻仰大佬们的开源项目是非常必要的。这里我为大家收集整理了10个优秀的开源项目,方便我们日常开发中学习! 作者:ListenToCode 博客:https://www.jianshu.com/p...

终端研发部
19分钟前
2
0
MiniUi tab页

architect刘源源
20分钟前
2
0
uitextview中'\n'不能换行的问题

后端返回的类似于这样的东西:'1、Fix bug;\n2、体验优化' 在textview里边是无法换行的,打断点发现 是因为 '\n'被转义成了'\\n'了 思路是replace。。。 _infoTextView.text = [self.info st...

RainOrz
25分钟前
1
0
年底了,该给自己写个总结了,一个六年女Java程序员的心声

简单的先说一下,坐标杭州,12届本科毕业,算上年前在阿里巴巴B2B事业部的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) 其中成功的...

Java架构资源分享
29分钟前
15
0
Shell脚本——cat/EOF输出多行

在某些场合,可能我们需要在脚本中生成一个临时文件,然后把该文件作为最终文件放入目录中。(可参考ntop.spec文件)这样有几个好处,其中之一就是临时文件不是唯一的,可以通过变量赋值,也...

吴伟祥
30分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部