publicclassThreadAdv{publicstaticvoidmain(String[] args){//串行方式//循环10亿次,每次都++运算long start =System.nanoTime();for(int i =0;i<10;i++){loop();loop();}long end =System.nanoTime();System.out.printf("串行执行耗时:%s毫秒%n",(end-start)/1000/1000);//并行的方式:main线程,子线程同时执行loop方法//子线程执行完,main线程才能一直向下执行//使用activeCount ,要用DeBuglong start2 =System.nanoTime();for(int i =0;i<10;i++){newThread((newRunnable(){@Overridepublicvoidrun(){loop();loop();}})).start();}//当前main线程和main线程中创建的子线程,活跃线程数>1,main线程就一直让步while(Thread.activeCount()>1)Thread.yield();long end2=System.nanoTime();System.out.printf("并行执行耗时:%s毫秒%n",(end2-start2)/1000/1000);}privatestaticvoidloop(){int n =10_0000_0000;int m =0;for(int i =0;i<n;i++){
m++;}}}
publicclassInterruptedResetFlag{publicstaticvoidmain(String[] args){// text1();text2();}publicstaticvoidtext1(){Thread t =newThread(newRunnable(){@Overridepublicvoidrun(){for(int i =0;i <10;i++){System.out.println(Thread.currentThread().isInterrupted());}}});
t.start();
t.interrupt();}publicstaticvoidtext2(){Thread t =newThread(newRunnable(){@Overridepublicvoidrun(){for(int i =0;i<10;i++){//i==0,打印true,重置标志位=falseSystem.out.println(Thread.interrupted());}//打印结果第一次为true,后面为false}});
t.start();
t.interrupt();//1.标志位=true}}
2.4线程等待
void
join()等待这个线程死亡
void
join(long millis)
线程引用对象.join()/线程引用对象.join(long)
当前线程等待,直到满足…条件
无参的方法,就是线程执行完毕;
有参的放撒,是线程执行完毕和时间到达任意一个满足,满足以后,当前线程继续往下执行。
publicclassThreadJoin{publicstaticvoidmain(String[] args)throwsInterruptedException{text1();}publicstaticvoidtext1()throwsInterruptedException{Thread t =newThread(newRunnable(){@Overridepublicvoidrun(){try{System.out.println("t start");Thread.sleep(3*1000);System.out.println("t.end");}catch(InterruptedException e){
e.printStackTrace();}}});
t.start();
t.join();//main线程一直阻塞等待,知道t线程执行完毕System.out.println("main running...");}publicstaticvoidtext2()throwsInterruptedException{Thread t =newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("t run");}});
t.start();
t.join();//main线程一直阻塞等待,知道t线程执行完毕System.out.println("main running...");}}