黑马程序员:如何结束线程及线程中的其他方法介绍:interrupt()、join()、yield()等方法
2013-11-04 19:56
441 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
停止线程
stop()已过时
如何停止线程?
只有一种:run方法结束
开启多线程运行,运行代码通常是循环结构
所以通常只要控制循环,就可以让run方法结束,也就是线程结束
示例:
特殊情况:
当线程处于冻结状态,就都取不到标记,那么线程就不会结束
当没有指定的方式让冻结的线程恢复到运行状态时,就需要对冻结进行清除。
强制让线程恢复到运行状态中来,这样就可以让线程判断标记从而结束。
Thread类提供了该方法 interrupt()
示例:
Thread中的另一个方法 setDaemon(boolean on)
格式
setDaemon(boolean on);
示例:
t1.setDaemon(true); //t1线程标记为守护线程
当所有线程都是守护线程时,虚拟机退出。
注:需要在线程开启之前标记
示例
t1.setDaemon(true);
t1.start();
如上文中的代码,不使用interrupt()方法,也可以通过守护线程方法结束程序
当主线程结束完毕之后,而t1和t2线程都是守护线程,则虚拟机退出
Thread中的又一个方法:join();
join():等待该线程结束。
当A线程执行到了B线程的.join()方法时,A就会等待,直到B线程都执行完了,A才会继续执行,和其他线程无关
join可以用来临时加入线程执行。
示例:
toString();返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
示例:
以字符串表示形式返回当前线程的信息 Thread.currentThread().toString();
Thread[Thread-0,5,main]
Thread[线程名称,优先级,线程组]
关于线程组:该线程由哪个线程开启的,就默认属于这个组,当然也可以加入到其他组
改变优先级的方法:
t1.setPriority(Thread.MAX_PRIORITY); //设置t1线程的优先级为最高级别
MAX_PRIORITY:最高级别 NORM_PRIORITY:默认级别MIN_PRIORITY:最低级别
Thread.yield();
暂停当前正在执行的线程对象,并执行其他线程。
若两个线程t1、t2同时执行run(),默认情况下是t1,t2线程随即由CPU执行
若在run()中加入Thread.yield();后,t1执行到此语句时,就会先暂停(释放执行权),这时t2就被CPU执行了。
多线程应用:
/*
假设循环体是各部分需要执行的内容,有3个循环体
要求多线程执行
*/
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
停止线程
stop()已过时
如何停止线程?
只有一种:run方法结束
开启多线程运行,运行代码通常是循环结构
所以通常只要控制循环,就可以让run方法结束,也就是线程结束
示例:
class StopThread implements Runnable { private boolean flag = true; private int count = 1; public synchronized void run() { while(flag) { System.out.println(Thread.currentThread().getName()+".....run"+flag+count++); } } public void changeFlag() { flag = false; } } class StopThreadDemo { public static void main(String[] args) { StopThread s = new StopThread(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); t1.start(); t2.start(); int num = 0; while(true) { if (num++ == 60) { s.changeFlag(); break; } System.out.println("=================="+num); } System.out.println("main-over"); } }
特殊情况:
当线程处于冻结状态,就都取不到标记,那么线程就不会结束
当没有指定的方式让冻结的线程恢复到运行状态时,就需要对冻结进行清除。
强制让线程恢复到运行状态中来,这样就可以让线程判断标记从而结束。
Thread类提供了该方法 interrupt()
示例:
class StopThread implements Runnable { private boolean flag = true; private int count = 1; public synchronized void run() { while(flag) { try { wait(); //t1、t2都wait()在这的情况 } catch(InterruptedException e) { System.out.println(Thread.currentThread().getName()+"Exception"); flag = false; } System.out.println(Thread.currentThread().getName()+".....run"+flag+count++); } } public void changeFlag() { flag = false; } } class StopThreadDemo { public static void main(String[] args) { StopThread s = new StopThread(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); t1.start(); t2.start(); int num = 0; while(true) { if (num++ == 60) { s.changeFlag(); t1.interrupt(); //interrupt(),Thread的方法,清除t1等待状态 t2.interrupt(); //清除t2等待状态 break; } System.out.println("=================="+num); } System.out.println("main-over"); } }
Thread中的另一个方法 setDaemon(boolean on)
格式
setDaemon(boolean on);
示例:
t1.setDaemon(true); //t1线程标记为守护线程
当所有线程都是守护线程时,虚拟机退出。
注:需要在线程开启之前标记
示例
t1.setDaemon(true);
t1.start();
如上文中的代码,不使用interrupt()方法,也可以通过守护线程方法结束程序
当主线程结束完毕之后,而t1和t2线程都是守护线程,则虚拟机退出
Thread中的又一个方法:join();
join():等待该线程结束。
当A线程执行到了B线程的.join()方法时,A就会等待,直到B线程都执行完了,A才会继续执行,和其他线程无关
join可以用来临时加入线程执行。
示例:
class Join implements Runnable { public void run() { for (int x=0; x<100; x++) { System.out.println(Thread.currentThread().getName()+"=====run"+x); } } } class JoinDemo { public static void main(String[] args) throws InterruptedException { Join j = new Join(); Thread t1 = new Thread(j); Thread t2 = new Thread(j); t1.start(); t1.join(); //当t1线程执行完run()后,主线程继续执行下面的代码。t1结束前,主线程处于冻结状态 t2.start(); for (int x=0; x<50; x++) { System.out.println(Thread.currentThread().getName()+"====="+x); } System.out.println("over"); } }
toString();返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
示例:
以字符串表示形式返回当前线程的信息 Thread.currentThread().toString();
Thread[Thread-0,5,main]
Thread[线程名称,优先级,线程组]
关于线程组:该线程由哪个线程开启的,就默认属于这个组,当然也可以加入到其他组
改变优先级的方法:
t1.setPriority(Thread.MAX_PRIORITY); //设置t1线程的优先级为最高级别
MAX_PRIORITY:最高级别 NORM_PRIORITY:默认级别MIN_PRIORITY:最低级别
Thread.yield();
暂停当前正在执行的线程对象,并执行其他线程。
若两个线程t1、t2同时执行run(),默认情况下是t1,t2线程随即由CPU执行
若在run()中加入Thread.yield();后,t1执行到此语句时,就会先暂停(释放执行权),这时t2就被CPU执行了。
多线程应用:
/*
假设循环体是各部分需要执行的内容,有3个循环体
要求多线程执行
*/
class ThreadDemo { public static void main(String[] args) { /*通过匿名内部类创建一个Thread的子类并通过start()开启线程*/ new Thread() { public void run() { for (int x=0; x<50; x++) { System.out.println(Thread.currentThread().getName()+"-------"+x); } } }.start(); /*主线程循环体*/ for (int x=0; x<50; x++) { System.out.println(Thread.currentThread().getName()+"-------"+x); } /*通过匿名内部类创建一个Runnable接口的子类*/ Runnable r = new Runnable() { public void run() { for (int x=0; x<50; x++) { System.out.println(Thread.currentThread().getName()+"-------"+x); } } }; new Thread(r).start(); // } }
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
相关文章推荐
- java线程当中 sleep() join() yield()方法的简单比较以及如何保护共享数据介绍
- 线程的笔记1 wait yield join interrupt deamon 死锁使用方法
- Java线程--interrupt join yield setDaemon常用方法的使用
- 关于线程中断interrupt()、谦让yield()、等待线程结束join()
- 黑马程序员------多线程(No.3)(停止线程、守护线程、Join方法、优先级&yield方法、总结)
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- 线程中的start、join、sleep、yield方法
- 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Thread方法解释(join,sleep,yield,interrupt)
- 《并发编程》--5.线程等待结束(join)和线程谦让(yield)
- 黑马程序员:Java基础——多线程的停止与守护以及Join,优先级和yield方法
- Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数
- java线程中的interrupt,isInterrupt,interrupted方法以及如何终止线程(一)
- java的join和yield方法处理线程顺序执行
- 多线程—04—守护线程、interrupt、join、yield、线程优先级
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- 多线程:interrupt()方法 守护线程 join()方法 及优先级
- java线程中的sleep/wait/notify/yield/interrupt方法 整理
- 多线程---其他方法 停止线程、守护线程、join方法