黑马程序员:如何结束线程及线程中的其他方法介绍: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 转学学校没学位怎么办 koa2 渲染网页慢怎么办 烤箱的灯不亮了怎么办 兰州新区非农户怎么办? 施工员证书到期怎么办 银行从业过期了怎么办 国地税合并协税员怎么办 快递员虚报重量怎么办 信用卡刷整数了怎么办 汽车年检尾气不合格怎么办 车辆年检尾气不合格怎么办 年检手刹不合格怎么办 社会保障卡怎么办郑州的 网约车驾驶员证怎么办 干洗出现问题了怎么办 教师工资太低了怎么办 鸽子得了新城疫怎么办 氮肥施多了怎么办 当兵体质差跑步怎么办 手盘核桃脏了怎么办 怀孕吃了巴旦木怎么办 护士证丢了怎么办 扶贫搬迁老房子怎么办 ucl录取差两分怎么办 考研准考证号填错了怎么办? 拿到工伤证后怎么办 专接本有挂科怎么办 小孩发烧后惊厥怎么办 深圳民办学校停办学生怎么办 教育机构不退钱怎么办 智慧树错过选课怎么办 河南城建学院怎么办网 建学校土地手续怎么办 德国预科不能毕业怎么办 想出国打工怎么办手续 终结执行了该怎么办 网银界面打不开怎么办 abr检查结果异常怎么办 大排畸胎儿位置不好怎么办 交社保中途死了怎么办 不知道社保密码怎么办