Java.线程.Thread类.Runnable接口.start().setDaemon().join()时间:2021-12-03 20:41:10凌晨零点。太晚了,脑子不转了。睡觉先。 ------------------------------------------------- Start //多个售票窗口同时卖票。总共100张车票。 class ThreadDemo2 { public static void main(String [] args) { TestThread t=new TestThread(); //TestThread类实例化了一个对象t。 /* //试图应用setName()设置线程名称不成功。why? Thread w1=new Thread(t); w1.currentThread().setName("窗口1"); w1.start(); Thread w2=new Thread(t); w2.currentThread().setName("窗口2"); w2.start(); Thread w3=new Thread(t); w3.currentThread().setName("窗口3"); w3.start(); */ //开了7个线程。 Thread w1=new Thread(t); w1.setDaemon(true); //将此线程转为后台线程。main运行结束时,此线程即结束 w1.start(); new Thread(t).start(); //下面六个为前台线程。main运行结束时,这些线程不会结束。 new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); } } class TestThread implements Runnable //定义TestThread类实现Runnable接口。 { private int tickets=100; public void run() { while(tickets>0) { /* //////////////////////测试程序安全问题。卖票的这几个线程不默契,可能会同一张票多次卖出或者卖到负数。// try { Thread.sleep(10); //Thread.sleep()静态方法:迫使线程执行到该处暂停执行,让出CPU给别的线程,在指定的时间后(毫秒)CPU回到被暂停的线程继续执行。在此处用来增大此程序出错的几率。 } catch(Exception e) { System.out.println(e.getMessage()); } //////////////////////////*/ System.out.println(Thread.currentThread().getName()+" is saling ticket "+tickets--); } } } //join()的应用 class JoinThread { public static void main(String [] args) { TestThread t=new TestThread(); Thread tt=new Thread(t); tt.start(); //i=10之前,tt所在的线程与main线程交替执行。i循环到100时,合并到main线程。所以要等到tt线程运行完之后main线程才会继续执行。 int i=0; while(i<=15) //10-15次要等到tt线程运行结束,才能运行。 { if(i==10) //i=10时,合并线程 { try { tt.join(); //当i=10时,合并到main线程 } catch(Exception e) { System.out.println(e.getMessage()); } } System.out.println("main thread "+i++); } } } class TestThread implements Runnable { public void run() { int i=0; while(i<20) { System.out.println(Thread.currentThread().getName()+" thread "+i++); } } }