黑马程序员:如何结束线程及线程中的其他方法介绍:interrupt()、join()、yield()等方法
来源:互联网 发布:独立域名网站 编辑:程序博客网 时间:2024/05/22 13:40
---------------------- 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
- 黑马程序员:如何结束线程及线程中的其他方法介绍:interrupt()、join()、yield()等方法
- 线程中的start、join、sleep、yield方法
- interrupt()方法结束子线程
- 多线程:interrupt()方法 守护线程 join()方法 及优先级
- 线程中的yield()方法
- 黑马程序员------多线程(No.3)(停止线程、守护线程、Join方法、优先级&yield方法、总结)
- java线程当中 sleep() join() yield()方法的简单比较以及如何保护共享数据介绍
- 线程:sleep()、wait()、yield()和join()方法
- 线程sleep()、wait()、yield()、join()方法 解析
- 线程:sleep()、wait()、yield()和join()方法
- 线程的sleep,join,yield方法
- java线程wait,notify,yield,join方法
- 线程join、yield、priority、daemon方法
- Java 线程yield 与 join 方法区别
- 线程中的join方法
- 线程中的join方法
- 黑马程序员 让某个线程结束的几种方法
- 黑马程序员-多线程:停止,守护线程,join方法
- java基础学习day08总结
- new和delete重载
- java 怎么确保输入整型 InputStreamReader BufferedReader
- IOS之KVC,KVO,KVB
- Myeclipse修改Servlet模板类操作
- 黑马程序员:如何结束线程及线程中的其他方法介绍:interrupt()、join()、yield()等方法
- 原型模式
- Mysql问题Access denied for user 'root'@'localhost'问题的解决
- 自适应参数估计+滑模变结构控制高超声速飞行器(源代码)
- cocos2dx-2.2 创建Android工程
- 【D3.js数据可视化系列教程】(二十七)--径向树
- PowerDesigner导入MySql步骤和解决问题Non SQL Error : Could not load class com.mysql.jdbc.Driver
- HOG行人检测 如何制作样品
- 校园网如何翻过网关访问外网?