中断线程的运行:

当一个线程运行时,另一个线程可以调用对应的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

由结果分析可知,实现了多线程的同步功能,多个代售点功能卖票。