`

Java 可中断线程

    博客分类:
  • Java
 
阅读更多

http://blog.csdn.net/sapphiron/article/details/3018053

 

PART.1 无法中断的线程

一个无法中断的线程的例子。

  1. public   class  UninterruptableThread
  2. {
  3.      @SuppressWarnings ( "deprecation" )
  4.      public   static   void  main(String[] args)  throws  Exception
  5.     {
  6.         Thread th =  new  Thread( new  TestRunnable());
  7.         
  8.          // 启动线程
  9.         System.out.println( "main: start thread." );
  10.         th.start();
  11.         
  12.          // 等待2秒
  13.         Thread.sleep( 2000 );
  14.         
  15.          // 中断线程
  16.         System.out.println( "main: interrupt thread." );
  17.         th.interrupt();
  18.         
  19.          // 等待2秒
  20.         Thread.sleep( 2000 );
  21.         
  22.          // 停止线程
  23.         System.out.println( "main: stop thread." );
  24.         th.stop();
  25.     }
  26.     
  27.      private   static   class  TestRunnable  implements  Runnable
  28.     {
  29.          @Override
  30.          public   void  run()
  31.         {
  32.             System.out.println( "Thread started." );
  33.              while  ( true )
  34.             {
  35.                  // 避免由于while(true)导致编译失败。
  36.                  if  ( false break ;
  37.             }
  38.             
  39.              // 清理工作
  40.             System.out.println( "Thread ended." );
  41.         }
  42.     }
  43. }
  • 输出结果:

main: start thread.
Thread started.
main: interrupt thread.
main: stop thread.

  • Thread对象的interrupt方法仅仅把该线程的一个标志置为true,该方法本身并不包含任何中断线程的操作。
  • stop方法可以将线程中止,但通过输出的结果可以发现,”Thread ended”并没有被输出,即线程本身不能进行任何清理工作。

PART.2 可中断的线程

  • 线程应不断检查isInterrupted是否为true,当其返回true时,应开始清理并结束线程。(Test1中的while循环)
  • Thread.sleep方法会在线程被中断时抛出InterruptedException,线程可以捕获该异常并开始清理和结束线程。(Test2中的Thread.sleep())
  • 如果循环中不时调用Thread.sleep,可以处理isInterrupted。

可中断线程的例子:

  1. public   class  GeneralTest
  2. {
  3.      public   static   void  main(String[] args)  throws  Exception
  4.     {
  5.         Thread th1 =  new  Thread( new  Test1());
  6.         Thread th2 =  new  Thread( new  Test2());
  7.         
  8.          // 启动 Test1 和 Test2 线程。
  9.         System.out.println( "main: starting 'Test1' and 'Test2'." );
  10.         th1.start();
  11.         th2.start();
  12.         
  13.          // 等待3秒。
  14.         System.out.println( "main: sleeping for 3 seconds." );
  15.         Thread.sleep( 3000 );
  16.         
  17.          // 中断 Test1 和 Test2 线程。
  18.         System.out.println( "main: interrupting 'Test1' and 'Test2'." );
  19.         th1.interrupt();
  20.         th2.interrupt();
  21.         
  22.          // 等待 Test1 和 Test2 线程结束。
  23.         System.out.println( "main: waiting for 'Test1' and 'Test2' to end." );
  24.         th1.join();
  25.         th2.join();
  26.         
  27.         System.out.println( "main: end." );
  28.     }
  29.     
  30.      private   static   class  Test1  implements  Runnable
  31.     {
  32.          @Override
  33.          public   void  run()
  34.         {
  35.             System.out.println( "Test1: start." );
  36.              while  (!Thread.currentThread().isInterrupted())
  37.             {
  38.                  // 其他操作...
  39.                 System.out.print( "" );
  40.             }
  41.             System.out.println( "Test1: end." );
  42.         }
  43.     }
  44.     
  45.      private   static   class  Test2  implements  Runnable
  46.     {
  47.          @Override
  48.          public   void  run()
  49.         {
  50.             System.out.println( "Test2: start." );
  51.              try
  52.             {
  53.                  while  ( true )
  54.                 {
  55.                      // 其他操作... 
  56.                     Thread.sleep( 1000 );
  57.                 }
  58.             }
  59.              catch  (InterruptedException e)
  60.             {
  61.                 System.out.println( "Test2: InterruptedException" );
  62.             }
  63.             System.out.println( "Test2: end." );
  64.         }
  65.     }
  66. }

PART.3 isInterrupted()和interrputed()方法的区别

  • isInterrupted方法是实例方法,interrupted方法是静态方法。

Thread.currentThread().isInterrupted()
Thread.interrupted()

  • interrupted方法在调用之后会将中断标志置为false。在只对线程调用一次interrupt的前提下interrupted方法只会返回一次true。
  • 使用interrupted方法判断应确保在判断之后开始结束线程。

isInterrupted和interrupted方法比较的例子:

  1. public   class  InterruptedStateTest
  2. {
  3.      public   static   void  main(String[] args)  throws  Exception
  4.     {
  5.          // "Test1"
  6.         Thread th1 =  new  Thread( new  Test1());
  7.         
  8.          // 启动 Test1 线程,并在3秒之后中断该线程。
  9.         th1.start();
  10.         Thread.yield();
  11.         
  12.         System.out.println( "Test1 started... Waiting 3 seconds." );
  13.         Thread.sleep( 3000 );
  14.         
  15.         System.out.println( "Interrupting Test1..." );
  16.         th1.interrupt();
  17.         
  18.         Thread.sleep( 1000 );
  19.         
  20.         System.out.println( "---------------------------------------" );
  21.                 
  22.          // “Test2"
  23.         Thread th2 =  new  Thread( new  Test2());
  24.          // 启动 Test2 线程,并在3秒之后中断该线程。
  25.         th2.start();
  26.         Thread.yield();
  27.         
  28.         System.out.println( "Test2 started... Waiting 3 seconds." );
  29.         Thread.sleep( 3000 );
  30.         
  31.         System.out.println( "Interrupting Test2..." );
  32.         th2.interrupt();
  33.         
  34.         Thread.yield();
  35.         
  36.          // 主线程结束。
  37.         System.out.println( "End of main." );
  38.     }
  39.     
  40.      private   static   class  Test1  implements  Runnable
  41.     {
  42.          @Override
  43.          public   void  run()
  44.         {
  45.             System.out.println( "Test1 start..." );
  46.              while  ( true )
  47.             {
  48.                  if  (Thread.currentThread().isInterrupted())
  49.                 {
  50.                      if  (Thread.currentThread().isInterrupted())
  51.                     {
  52.                         System.out.println( "Interrupted..." );
  53.                          break ;
  54.                     }
  55.                 }
  56.             }
  57.             System.out.println( "Test1 end..." );
  58.         }
  59.     }
  60.     
  61.      private   static   class  Test2  implements  Runnable
  62.     {
  63.          @Override
  64.          public   void  run()
  65.         {
  66.              // 记录线程开始时间。
  67.              long  startTime = System.currentTimeMillis();
  68.             
  69.             System.out.println( "Test2 start... "  +
  70. "Automatically ends in 6 sec." );
  71.             
  72.              while  ( true )
  73.             {
  74.                  // 连续判断2次Thread.interrupted()
  75.                  if  (Thread.interrupted())
  76.                 {
  77.                      if  (Thread.interrupted())
  78.                     {
  79.                         System.out.println( "Interrupted..." );
  80.                          break ;
  81.                     }
  82.                 }
  83.                 
  84.                  // 如果线程2运行超过6秒将自动结束。
  85.                  if  (System.currentTimeMillis() - startTime >  6000  )
  86.                 {
  87.                     System.out.println( "5 seconds..." );
  88.                      break ;
  89.                 }
  90.             }
  91.             System.out.println( "Test2 end" );
  92.         }
  93.     }
  94. }

例子中Test1连续判断2次Thread.currentThread().isInterrupted(), Test1仍然可以正常中断。

  1. if  (Thread.currentThread().isInterrupted())
  2. {
  3.      if  (Thread.currentThread().isInterrupted())
  4.     {
  5.          // 结束线程。
  6.     }
  7. }

Test2连续判断2次Thread.interrupted(),因此Test2线程在被调用interrupt之后没有结束。

  1. if  (Thread.interrupted())
  2. {
  3.      if  (Thread.interrupted())
  4.     {
  5.      // 结束线程。
  6.     }
  7. }

PART.4 处理阻塞

阻塞操作如BufferedReader的readLine方法,ServerSocket的accept方法将导致线程不能判断 isInterrupted(),因此线程中的阻塞不能永久阻塞。处理阻塞的方法有以下:

  • 在调用阻塞方法时设置超时时间:

 

方法

超时后的处理

ReentrantLock

ReadLock

WriteLock

tryLock (long, TimeUnit)

返回 false

Condition

await (long, TimeUnit)

awaitNanos (long)

awaitUntil (Date)

返回 false

Future

get (long, TimeUnit)

TimeoutException

CyclicBarrier

await (long, TimeUnit)

TimeoutException

CountDownLatch

await (long, TimeUnit)

返回 false

Exchanger

exchange (V, long, TimeUnit)

TimeoutException

Semaphore

tryAcquire (long, TimeUnit)

返回 false

BlockingQueue <E>

offer (E, long, TimeUnit)

poll (long, TimeUnit)

返回 false

返回 null

BlockingDeque <E>

offerFirst (E, long, TimeUnit)

offerLast (E, long, TimeUnit)

poolFirst (long, TimeUnit)

poolLast (long, TimeUnit)

返回 false

 

返回 null

ServerSocket

accept ()

通过 setSoTimeout 设置超时时间。

SocketTimeoutException

  • 该方法在阻塞时如果线程被中断,可以抛出一个异常:

 

方法

异常

Thread

sleep (long)

join ()

InterruptedException

 

ReentrantLock

ReadLock

WriteLock

lockInterruptibly ()

InterruptedException

Condition

await()

InterruptedException

Future

get ()

InterruptedException

CyclicBarrier

await ()

InterruptedException

CountDownLatch

await ()

InterruptedException

Exchanger

exchange (V)

InterruptedException

Semaphore

acquire ()

InterruptedException

BlockingQueue <E>

put (E)

take ()

InterruptedException

BlockingDeque <E>

putFirst (E)

putLast (E)

takeFirst (E)

takeLast (E)

InterruptedException

  • 调用不可中断阻塞方法的可中断版本:

 

阻塞方法

可中断方法

ReentrantLock

ReadLock

WriteLock

lock ()

tryLock ()

tryLock (long, TimeUnit)

lockInterruptibly ()

Condition

awaitUninterruptibly ()

await ()

await (long, TimeUnit)

awaitNanos (long)

awaitUntil (Date)

Semaphore

acquireUninterruptibly ()

acquire()

tryAcquire()

tryAcquire(long, TimeUnit)

  • 不能设置超时也不能抛出异常的阻塞方法:
  1. synchronized块,Object的wait方法。可以使用ReentrantLock和Condition替代。
  2. BufferedReader的readLine方法,ObjectInputStream得readObject方法。(如果底层流是通过Socket获得,可以通过Socket设置超时)

PART.5 处理Thread.sleep()

1. 捕获异常并结束线程

  • 捕获InterruptedException异常,开始清理操作并结束线程。
  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          while  ( true )
  6.         {
  7.              // 需要进行的操作
  8.             Thread.sleep( 500 );
  9.         }
  10.     }
  11.      catch  (InterruptedException e)
  12.     {
  13.     }
  14.     
  15.      // 清理操作
  16. }

2. 捕获异常,再次调用interrupt

  1. public   void  run()
  2. {
  3.      while  (!Thread.currentThread().isInterrupted())
  4.     {
  5.          try
  6.         {
  7.              // 需要进行的操作 1
  8.             Thread.sleep( 500 );
  9.         }
  10.          catch  (InterruptedException e)
  11.         {
  12.              // 再次调用interrupt
  13.             Thread.currentThread().interrupt();
  14.         }
  15.         
  16.          try
  17.         {
  18.              // 需要进行的操作 2
  19.             Thread.sleep( 500 );
  20.         }
  21.          catch  (InterruptedException e)
  22.         {
  23.              // 再次调用interrupt
  24.             Thread.currentThread().interrupt();
  25.         }
  26.     }
  27.     
  28.      // 清理操作
  29. }

PART.6 处理ReentrantLock和Condition

1. 通过lockInterruptibly方法中断

  • 捕获lockInterruptibly方法可能跑出的InterruptedException,并结束线程。
  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          while  ( true )
  6.         {
  7.             locker.lockInterruptibly();
  8.              // 其他操作
  9.             locker.unlock();
  10.         }
  11.     }
  12.      catch  (InterruptedException e)
  13.     {
  14.     }
  15.      // 清理操作
  16. }

2. 通过不设置超时的tryLock方法中断

  • tryLock方法将不阻塞。
  • 通过捕获Thread.sleep的异常(或其他方法)中断线程。
  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          while  ( true )
  6.         {
  7.              if  (locker.tryLock())
  8.             {
  9.                  // 其他操作
  10.             }
  11.             
  12.             Thread.sleep( 500 );
  13.         }
  14.     }
  15.      catch  (InterruptedException e)
  16.     {
  17.     }
  18. }

3. 通过设置超时的tryLock方法中断

  • 捕获tryLock方法在线程中断时抛出的InterrupedException并结束线程。
  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          while  ( true )
  6.         {
  7.              if  (locker.tryLock( 1 , TimeUnit.SECONDS))
  8.             {
  9.                  // 其他操作
  10.             }
  11.         }
  12.     }
  13.      catch  (InterruptedException e)
  14.     {
  15.     }
  16.      // 清理操作
  17. }
4. 通过捕获Conditon的await方法抛出的异常中断
  • 捕获Condition的await方法抛出的异常并结束线程。
  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          while  ( true )
  6.         {
  7.             locker.lockInterruptibly();
  8.             condition.await();
  9.              // 其他操作
  10.             locker.unlock();
  11.         }
  12.     }
  13.      catch  (InterruptedException e)
  14.     {
  15.     }
  16.      // 清理操作
  17. }

5. 可中断的Producer和Consumer示例

  • produce方法在线程中断时将跑出InterruptedException。
  • run方法捕获该异常,并中断线程。
  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          while  ( true )
  6.         {
  7.             produce();
  8.             Thread.sleep(( int )(Math.random() *  3000 ));
  9.         }
  10.     }
  11.      catch  (InterruptedException e)
  12.     {
  13.     }
  14.     System.out.println( "producer: end." );
  15. }
  16. private   void  produce()  throws  InterruptedException
  17. {
  18.     locker.lockInterruptibly();
  19.      try
  20.     {
  21.          // Produce
  22.          int  x = ( int )(Math.random() *  100 );
  23.         queue.offer(x);
  24.         emptyCondition.signalAll();
  25.         System.out.printf( "producer: %d and signal all. queue = %d /n" ,
  26.                 x, queue.size());
  27.     }
  28.      finally
  29.     {
  30.         locker.unlock();
  31.     }
  32. }
  • Consumer线程被中断后不结束,直到队列内所有数据被输出。
  • 不使用Thread.currentThread().isInterrupted()而定义isInt记录中断,可以避免中断导致ReentrantLock方法的tryLock不能获得锁而直接抛出异常。
  1. public   void  run()
  2. {
  3.      // 线程是否被中断
  4.      boolean  isInt =  false ;
  5.     
  6.      // 线程中断后,将队列内的数据全部读出,再结束线程。
  7.      while  (!isInt || !queue.isEmpty())
  8.     {
  9.          try
  10.         {
  11.             consume();
  12.             Thread.sleep(( int )(Math.random() *  3000 ));
  13.         }
  14.          catch  (InterruptedException e)
  15.         {
  16.             isInt =  true ;
  17.         }
  18.     }
  19.     System.out.println( "consumer: end." );
  20. }
  21. private   void  consume()  throws  InterruptedException
  22. {
  23.      if  (!locker.tryLock( 5 , TimeUnit.SECONDS))
  24.     {
  25.          // 没有获得锁,不进行任何操作。 避免死锁。
  26.          return ;
  27.     }
  28.     
  29.      try
  30.     {
  31.          // Consume
  32.          while  (queue.isEmpty())
  33.         {
  34.             System.out.println( "consumer: waiting for condition." );
  35.              if  (!emptyCondition.await( 5 , TimeUnit.SECONDS))
  36.             {
  37.                  // 5秒没有等待到条件,不进行任何操作。
  38.                  // 避免中断后在此处等待。
  39.                  return ;
  40.             }
  41.         }
  42.          int  x = queue.poll();
  43.         System.out.printf( "consumer: %d, queue=%d /n" , x, queue.size());
  44.     }
  45.      finally
  46.     {
  47.         locker.unlock();
  48.     }
  49. }
PART.7 处理BlockingQueue
  • 使用BlockingQueue处理Consumer和Producer问题。
  • put和take方法可以在线程被中断时抛出InterruptedException。

Producer:

  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          while  ( true )
  6.         {
  7.              int  x = ( int )(Math.random() *  100 );
  8.             queue.put(x);
  9.             System.out.println( "producer: "  + x);
  10.             Thread.sleep(( int )(Math.random() *  3000 ));
  11.         }
  12.     }
  13.      catch  (InterruptedException e)
  14.     {
  15.     }
  16.     System.out.println( "producer: end." );
  17. }

Consumer:

  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          while  ( true )
  6.         {
  7.              int  x = queue.take();
  8.             System.out.println( "consumer: "  + x);
  9.             Thread.sleep(( int )(Math.random() *  3000 ));
  10.         }
  11.     }
  12.      catch  (InterruptedException e)
  13.     {
  14.     }
  15.     System.out.println( "consumer: end." );
  16. }

PART.8 处理Socket和ServerSocket

1. 处理ServerSocket的accept方法

  • 调用ServerSocket的setSoTimeout方法设置超时时间。
  • 捕获并处理超时引起的SocketTimeoutException。
  • 不需要处理该异常。
  1. public   void  run()
  2. {
  3.      try
  4.     {
  5.          // 设置超时时间
  6.         serverSocket.setSoTimeout( 2000 );
  7.     }
  8.      catch  (SocketException e)
  9.     {
  10.         e.printStackTrace();
  11.         System.exit(- 1 );
  12.     }
  13.     
  14.      while  (!Thread.currentThread().isInterrupted())
  15.     {
  16.          try
  17.         {
  18.              @SuppressWarnings ( "unused" )
  19.             Socket s = serverSocket.accept();
  20.         }
  21.          catch  (SocketTimeoutException e)
  22.         {
  23.              // 超时,不进行任何处理,再次调用accept方法
  24.         }
  25.          catch  (IOException e)
  26.         {
  27.             e.printStackTrace();
  28.         }
  29.     }
  30.      // 清理工作
  31. }

2. 处理包装自Socket的BufferedReader的readLine方法

  • 调用Socket的setSoTimeout方法设置超时时间。
  • BufferedReader的readLine方法在阻塞指定的时间后将抛出SocketTimeoutException。
  • 不需要处理该异常。
  1. public   void  run()
  2. {
  3.     BufferedReader reader =  null ;
  4.     
  5.      try
  6.     {
  7.          // 建立测试用的链接
  8.         serverSocket =  new  ServerSocket( 10009 );
  9.         socket =  new  Socket( "127.0.0.1" 10009 );
  10.         
  11.         Thread.sleep( 500 );
  12.         Socket s = serverSocket.accept();
  13.         
  14.          // 向socket发送5行数据
  15.         OutputStreamWriter w =  new  OutputStreamWriter(
  16.                 s.getOutputStream());
  17.         w.write( "line1 /n line2 /n line3 /n line4 /n line5 /n" );
  18.         w.flush();
  19.         
  20.          // 设置超时
  21.         socket.setSoTimeout( 1000 );
  22.          // 创建BufferedReader
  23.         reader =  new  BufferedReader(
  24.                  new  InputStreamReader(socket.getInputStream()));
  25.     }
  26.      catch  (IOException e)
  27.     {
  28.         e.printStackTrace();
  29.         System.exit(- 1 );
  30.     }
  31.      catch  (InterruptedException e)
  32.     {
  33.         e.printStackTrace();
  34.         System.exit(- 1 );
  35.     }
  36.     
  37.      while  (!Thread.currentThread().isInterrupted())
  38.     {
  39.          try
  40.         {
  41.             String s = reader.readLine();
  42.             
  43.              if  (s ==  null )
  44.             {
  45.                  // 流结束
  46.                  break ;
  47.             }
  48.             
  49.              // 输出读取的数据
  50.             System.out.println( "thread: "  + s);
  51.         }
  52.          catch  (SocketTimeoutException e)
  53.         {
  54.             System.out.println( "thread: socket timeout." );
  55.         }
  56.          catch  (IOException e)
  57.         {
  58.             e.printStackTrace();
  59.         }
  60.     }
  61.     
  62.      // 清理
  63.      try  { serverSocket.close(); }  catch  (Exception e) { }
  64.      try  { socket.close(); }  catch  (Exception e) { }
  65.     System.out.println( "thread: end." );
  66. }

3. 处理包装自Socket的ObjectInputStream的readObject方法

  • 与readLine的处理方法类似。
  • 调用Socket的setSoTimeout方法设置超时时间。
  • ObjectInputStream的readObject方法在阻塞指定的时间后将抛出异常。
  • 不需要处理该异常。
  1. public   void  run()
  2. {
  3.     ObjectInputStream ois =  null ;
  4.      try
  5.     {
  6.          // 建立测试用的链接
  7.         serverSocket =  new  ServerSocket( 10009 );
  8.         socket =  new  Socket( "127.0.0.1" 10009 );
  9.         Thread.sleep( 500 );
  10.         Socket s = serverSocket.accept();
  11.          // 向socket发送3个对象
  12.         ObjectOutputStream oos =  new  ObjectOutputStream(
  13.                 s.getOutputStream());
  14.         oos.writeObject( new  TestData( "object 1" ));
  15.         oos.writeObject( new  TestData( "object 2" ));
  16.         oos.writeObject( new  TestData( "object 3" ));
  17.          // 设置超时
  18.         socket.setSoTimeout( 1000 );
  19.          // 创建ObjectInputStream
  20.         ois =  new  ObjectInputStream(socket.getInputStream());
  21.     }
  22.      catch  (IOException e)
  23.     {
  24.         e.printStackTrace();
  25.         System.exit(- 1 );
  26.     }
  27.      catch  (InterruptedException e)
  28.     {
  29.         e.printStackTrace();
  30.         System.exit(- 1 );
  31.     }
  32.      while  (!Thread.currentThread().isInterrupted())
  33.     {
  34.          try
  35.         {
  36.             TestData s = (TestData)ois.readObject();
  37.              if  (s ==  null )
  38.             {
  39.                  // 流结束
  40.                  break ;
  41.             }
  42.              // 输出读取的数据
  43.             System.out.println( "thread: "  + s.data);
  44.         }
  45.          catch  (SocketTimeoutException e)
  46.         {
  47.             System.out.println( "thread: socket timeout." );
  48.         }
  49.          catch  (IOException e)
  50.         {
  51.             e.printStackTrace();
  52.         }
  53.          catch  (ClassNotFoundException e)
  54.         {
  55.             e.printStackTrace();
  56.         }
  57.     }
  58.      // 清理
  59.      try  { serverSocket.close(); }  catch  (Exception e) { }
  60.      try  { socket.close(); }  catch  (Exception e) { }
  61.     System.out.println( "thread: end." );
  62. }

其中, TestData 是一个简单的可序列化的类。

  1. private   static   class  TestData  implements  Serializable
  2. {
  3.      private   static   final   long  serialVersionUID = 6147773210845607198L;
  4.      public  String data;
  5.      public  TestData(String data)
  6.     {
  7.          this .data = data;
  8.     }
  9. }

 

PART.9 总结

见“PART.2可中断的线程”和“PART.4 处理阻塞”。

分享到:
评论

相关推荐

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    Java 实例 - 中断线程源代码+详细指导教程.zip

    以下是关于Java中断线程的一些关键知识点: 1. **线程状态**:在Java中,线程有多种状态,包括新建、可运行、运行、阻塞、等待、超时等待和终止。中断线程主要是针对那些处于运行、阻塞或等待状态的线程。 2. **...

    java多线程Demo

    - interrupt()方法用于中断线程,如果线程正在阻塞(如sleep或wait),会被中断并抛出InterruptedException。 通过这些技术,我们可以构建高效、稳定、响应迅速的多线程应用程序。在实际开发中,应根据具体需求...

    java中断线程的正确姿势完整示例.rar

    本示例将详细探讨Java中断线程的正确方法,以确保线程安全且高效地退出。 首先,我们需要了解Java中的线程中断机制。线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行...

    java多线程的讲解和实战

    9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...

    java通过线程控制程序执行超时(新)

    // 超时后中断线程 } ``` 基本数据类型在超时控制中主要体现在计算或比较操作上,例如,我们可以用long类型的变量记录开始时间,然后在超时检查时与当前时间进行比较。反射则允许我们在运行时动态获取类、方法和...

    java 多线程并发实例

    Java的Thread类提供了start()来启动线程,interrupt()来中断线程,但需要注意的是,中断并不一定能立即停止线程,线程需要自行检查并响应中断状态。 另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多...

    Java中实现线程的超时中断方法实例

    1. 使用 Thread.interrupt() 方法设置线程的中断标志,但是这并不能真正中断线程,而是通知线程可以被中断。 2. 使用 ScheduledThreadPoolExecutor 来延迟执行任务,任务中执行线程的 interrupt() 方法。 使用 ...

    Java多线程编程核心技术_完整版_java_

    1. Thread.interrupt():用于中断线程,但不一定立即停止,需要在run()方法内部检查中断标志并作出相应处理。 2. InterruptedException:线程被中断时抛出的异常,通常需要捕获并处理。 九、线程死锁 1. 死锁的概念...

    JAVA-多线程 所有文件

    11. **线程中断**:通过`interrupt()`方法可以中断一个线程,但需要注意中断只是个标志,线程可能需要检查并响应中断。 12. **线程局部变量**:`ThreadLocal`类提供了线程局部变量,每个线程都有自己的副本,不会...

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    Java提供了一个更安全的中断线程的机制,即`Thread.interrupt()`。当调用`interrupt()`时,目标线程的中断状态会被设置,线程在检查到中断状态后可以决定如何响应。例如,`Thread.sleep()`、`SocketInputStream....

    Java多线程练习题

    Thread类提供了interrupt()方法用于中断线程,但是需要注意的是,中断并不是立即停止线程,而是设置一个中断标志,线程需要在适当的地方检查这个标志并处理中断。 通过对以上知识点的深入理解和实践,开发者可以...

    java程序 两个线程实现学生成绩的读写

    在实际编程中,还需要考虑异常处理,防止线程中断或其他异常情况导致程序崩溃。 在设计这样的程序时,我们需要注意以下几个关键点: 1. **数据同步**:确保在读写操作时对共享数据的访问是安全的,避免数据不一致...

    JAVA多线程编程技术PDF

    Lock接口提供了更细粒度的锁控制,支持可中断和可重入的锁。volatile确保变量在多线程环境中的可见性和有序性,避免缓存一致性问题。 此外,线程间通信也是多线程编程的重要方面。Java提供了wait(), notify()和...

    Java多线程编程实战指南-核心篇

    而检查异常(Checked Exceptions)如果在线程中抛出,需在该线程或其祖先线程中捕获,否则会导致线程中断。 最后,书中还将涵盖Java内存模型(JMM)和volatile关键字。JMM定义了线程如何访问共享变量的规则,保证了...

    Java多线程详解及示例

    Thread类提供了interrupt()方法用于中断线程,但需要注意的是,这并不意味着线程会立即停止,而是在线程检查到中断标志后自行决定是否停止。守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护...

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    5. **线程状态**:Java线程有五种基本状态:新建、可运行、运行、阻塞和死亡。线程的状态转换反映了其生命周期的不同阶段。 6. **线程同步**:为了避免线程间的冲突,Java提供了多种同步机制,如`synchronized`...

    Java多线程技术精讲

    Java中控制线程的方法有多种,如start()启动线程,run()执行线程,sleep()让线程休眠,join()等待其他线程完成,yield()让当前线程暂停,让其他线程有机会执行,以及interrupt()和isInterrupted()用于中断和检查线程...

    Java多线程笔记

    Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,可以使用 ...

    超实用的Java并发多线程教程

    3. `Lock`接口:相比`synchronized`,`Lock`提供了更细粒度的控制,支持可中断锁、尝试获取锁和读写锁等特性。 三、线程协作 1. `wait()`, `notify()`, `notifyAll()`:这三个方法是`Object`类的成员,用于线程间的...

Global site tag (gtag.js) - Google Analytics