八. 线程的强制执行 join()
让这个线程强制最先执行。
//线程的 join 方法 @Test public void joinTest() throws Exception{ JoinRunnable joinRunnable=new JoinRunnable(); Thread thread=new Thread(joinRunnable); //启动 thread.start(); // 主线程有10个,副线程100个,按理是 main先执行完, 加入了 join之后,强制让副线程先执行完。 for(int i=0;i<10;i++){ //让当前线程死掉. if(i==8){ //当运行8后, 让 thread线程强制运行,即到 i=8了,不运行了,让 其他线程运行了。 // 保证 i=8,i=9 最后输出。 thread.join(); } System.out.println("当前线程:"+Thread.currentThread().getName()+"运行到:"+i); } } class JoinRunnable implements Runnable{ @Override public void run() { for(int i=0;i<100;i++){ System.out.println("输出内容:"+Thread.currentThread().getName()+",运行到:"+i); } } }
运行程序, 查看控制台输出:
九. 线程的暂时挂起,不执行 yield()
注意, yield() 方法,只是让此线程释放资源,不执行,但不能保证最后执行。 可以线程 i=8时,得到了资源, 然后判断了i>=7, 执行 .yield() 方法,释放资源, 忽然它又得到了资源, 那么i=8 就会运行了。 不像 join()那样强制。
@Test public void yieldTest() throws Exception{ YieldRunnable yieldRunnable=new YieldRunnable(); Thread thread=new Thread(yieldRunnable); //启动 thread.start(); for(int i=0;i<100;i++){ System.out.println("当前线程:"+Thread.currentThread().getName()+"运行到:"+i); } } class YieldRunnable implements Runnable{ @Override public void run() { Thread thread=Thread.currentThread(); for(int i=0;i<10;i++){ if(i>=7){ //级别设置小点, 让其不执行。 thread.setPriority(Thread.MIN_PRIORITY); Thread.yield(); } System.out.println("输出内容:"+thread.getName()+",运行到:"+i); } } }
运行程序,查看控制台输出
这儿的 i=7,i=8,i=9 就得到了资源,执行了,而不是强制最后执行。
十. 打断休眠 interrupt()
主要用于 打断 休眠。
@Test public void interTest() throws Exception{ InterruptRunnable interruptRunnable=new InterruptRunnable(); Thread thread=new Thread(interruptRunnable); //启动 thread.start(); //休眠两秒 Thread.sleep(2000); //两秒之后,进行打断, 副线程应该还在休眠的状态上。 thread.interrupt(); Thread.sleep(5000); } class InterruptRunnable implements Runnable{ @Override public void run() { System.out.println("开始进行休眠"); try { Thread.sleep(5000); System.out.println("休眠结束"); } catch (InterruptedException e) { System.out.println("休眠被打断"); } System.out.println("退出休眠"); } }
运行程序,
十.一 设置停止和重启
以前 是有 stop() 这样的方法的,后来被抛弃了, 用标志位进行设置关闭和启动。
class MyRunnableDemo implements Runnable{ private boolean isRun=true; @Override public void run() { //定义此标识位 while(isRun){ try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("打印输出"); } } //通过标识位进行相应的控制 public void stop(){ this.isRun=false; } public void restart(){ this.isRun=true; run(); } } public class StopDemo { public static void main(String[] args) { MyRunnableDemo myRunnableDemo=new MyRunnableDemo(); Thread thread=new Thread(myRunnableDemo); System.out.println("开始启动"); thread.start(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } myRunnableDemo.stop(); System.out.println("停止"); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("重新启动"); myRunnableDemo.restart(); } }
运行程序,查看控制台。
这就是 Thread 类的常用方法,必须要掌握使用。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!