自学多线程-3
中断线程的运行:
当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它。
代码示例如下:
classKirlimplementsRunnable { publicvoidprintText() { System.out.println("Thread1startsleep"); try{ Thread.sleep(5000); } catch(Exceptione) { System.out.println("Thread1block"); return; } System.out.println("Thread1quit"); } publicvoidrun() { printText(); } } publicclassTestThread{ /** *@paramargs *@throwsException */publicstaticvoidmain(String[]args)throwsException{ //TODOAuto-generatedmethodstub Kirlk1=newKirl(); Threadt1=newThread(k1,"Kirl"); System.out.println("Kirlstart"); t1.start(); System.out.println("Mainsleep"); try{ Thread.sleep(3000); }catch(Exceptione){ //TODO:handleexception } System.out.println("Mainblockstart"); t1.interrupt(); System.out.println("Mainquit"); } }
运行结果如下:
Kirl start
Main sleep
Thread1 start sleep
Main block start
Main quit
Thread1 block
由以上结果可知,当Thread1线程执行过程中,Main线程发出中断Thread1线程的命令,则Thread1线程被中断,抛出异常。
查看线程的中断状态:
可以在Thread对象上调用isInterrupted()方法来检查任何线程的中断状态。
示例代码如下:
publicclassTestThread{ /** *@paramargs *@throwsException */publicstaticvoidmain(String[]args)throwsException{ //TODOAuto-generatedmethodstub Threadt=Thread.currentThread(); System.out.println("Time1:"+t.isInterrupted()); t.interrupt(); System.out.println("Time2:"+t.isInterrupted()); System.out.println("Time3:"+t.isInterrupted()); try{ Thread.sleep(2000); System.out.println("Interruptedfailed!"); }catch(Exceptione) { System.out.println("Interruptedsuccess!"); } System.out.println("Time4:"+t.isInterrupted()); } }
运行结果如下:
Time1:false
Time2:true
Time3:true
Interrupted success!
Time4:false
由以上结果可知,线程如果中断之后再休眠,则会清除中断标志。
多线程的同步问题:
代码示例如下:
classKirlimplementsRunnable { privateintticket=7; publicsynchronizedvoidsell() { while(ticket>0) { try{ Thread.sleep(100); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"->"+ticket--); } } publicvoidrun() { this.sell(); } } publicclassTestThread{ /** *@paramargs *@throwsException */publicstaticvoidmain(String[]args)throwsException{ //TODOAuto-generatedmethodstub Kirlk=newKirl(); Threadt1=newThread(k,"Thread1"); Threadt2=newThread(k,"Thread2"); Threadt3=newThread(k,"Thread3"); t1.start(); t2.start(); t3.start(); } }
运行结果如下:
Thread1->7
Thread1->6
Thread1->5
Thread1->4
Thread1->3
Thread1->2
Thread1->1
由以上结果可知,虽然实现了多线程共享资源的问题,但只有一个线程在执行,故并不是真正的实现了多线程的同步功能。即只有一个代售点在售票。
classKirlimplementsRunnable { privateintticket=7; publicvoidsell() { while(ticket>0) { synchronized(this){ if(this.ticket>0){ try{ Thread.sleep(100); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"->"+ticket--); } } } } publicvoidrun() { this.sell(); } } publicclassTestThread{ /** *@paramargs *@throwsException */publicstaticvoidmain(String[]args)throwsException{ //TODOAuto-generatedmethodstub Kirlk=newKirl(); Threadt1=newThread(k,"Thread1"); Threadt2=newThread(k,"Thread2"); Threadt3=newThread(k,"Thread3"); t1.start(); t2.start(); t3.start(); } }
运行结果如下:
Thread2->7
Thread2->6
Thread3->5
Thread3->4
Thread3->3
Thread1->2
Thread1->1
由结果分析可知,实现了多线程的同步功能,多个代售点功能卖票。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。