Java学习日志(12-2-多线程相关操作)
博客专区 > Almon 的博客 > 博客详情
Java学习日志(12-2-多线程相关操作)
Almon 发表于1年前
Java学习日志(12-2-多线程相关操作)
  • 发表于 1年前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

停止线程

    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();
	}
}

 

共有 人打赏支持
粉丝 2
博文 64
码字总数 44346
×
Almon
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: