package com.javase.thread; /** * 如果sleep睡得太久,希望他提前醒来,也就是说怎么唤醒一个正在睡眠的线程 * 注意:这里是中断线程的睡眠,而不是终断线程的执行 */ public class ThreadText07 { public static void main(String[] args) { //创建线程对象 Thread t = new Thread(new MyRunnable2()); //修改线程名称 t.setName("tt"); //启动线程 t.start(); //主线程睡眠5秒 try { Thread.sleep(1000 * 5); } catch (InterruptedException e) { e.printStackTrace(); } //中断t线程的睡眠(这种中断睡眠的方式是依靠了java的异常处理机制,让sleep出现了异常,睡眠就终止了) t.interrupt(); //t.stop();该方法已经过时。也是通过异常来中断睡眠的 } } class MyRunnable2 implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName() + "---->开始"); // 睡眠一个月 try { Thread.sleep(1000 * 60 * 60 * 24 * 30); } catch (InterruptedException e) { // 打印异常信息 e.printStackTrace();//如果删除这一行,就不会输出异常信息 } System.out.println(Thread.currentThread().getName() + "---->结束"); } }
package com.javase.thread; /* 怎么合理的终止一个线程的执行 答:在外面修改布尔标记的值,通过选择结构语句if来终止一个线程的执行 */ public class ThreadText08 { public static void main(String[] args) { // 创建一个MyThread08类的对象 MyThread08 myThread08 = new MyThread08(); // 创建一个线程 Thread t = new Thread(myThread08); // 给线程改名为tt t.setName("tt"); // 启动分支线程 t.start(); // 主线程休眠5秒 try { Thread.sleep(1000 * 5); } catch (InterruptedException e) { e.printStackTrace(); } // 改变myThread对象的属性r的值为false,即可终止分支线程 myThread08.r = false; } } class MyThread08 implements Runnable{ boolean r = true;//俗称打布尔标记,这里的r是MyThread08类的一个属性 @Override public void run() { for (int i = 0; i < 10; i++) { //每次循环都判断属性(布尔标记)r的值 if (r){ System.out.println(Thread.currentThread().getName() + "--->" + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }else { //如果在具体应用中,有一些文件或数据需要保存,可以在这里进行相应的操作。然后再结束程序 return; } } } }