精华内容
下载资源
问答
  • 中断JAVA线程

    2015-01-22 10:11:16
     中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。  线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,...
    背景

        中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。

       线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。


        首先,忘掉Thread.stop方法。虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的,这意味着,在未来的JAVA版本中,它将不复存在。

        一些轻率的家伙可能被另一种方法Thread.interrupt所迷惑。尽管,其名称似乎在暗示着什么,然而,这种方法并不会中断一个正在运行的线程(待会将进一步说明),正如Listing A中描述的那样。它创建了一个线程,并且试图使用Thread.interrupt方法停止该线程。Thread.sleep()方法的调用,为线程的初始化和中止提供了充裕的时间。线程本身并不参与任何有用的操作。

    class Example1 extends Thread {
                boolean stop=false;
                public static void main( String args[] ) throws Exception {
                Example1 thread = new Example1();
                System.out.println( "Starting thread..." );
                thread.start();
                Thread.sleep( 3000 );
                System.out.println( "Interrupting thread..." );
                thread.interrupt();
                Thread.sleep( 3000 );
                System.out.println("Stopping application..." );
                //System.exit(0);
                }
                public void run() {
                while(!stop){
                System.out.println( "Thread is running..." );
                long time = System.currentTimeMillis();
                while((System.currentTimeMillis()-time < 1000)) {
                }
                }
                System.out.println("Thread exiting under request..." );
                }
                }

    如果你运行了Listing A中的代码,你将在控制台看到以下输出:

    Starting thread...

    Thread is running...

    Thread is running...

    Thread is running...

    Interrupting thread...

    Thread is running...

    Thread is running...

    Thread is running...

    Stopping application...

    Thread is running...

    Thread is running...

    Thread is running...
    ...............................
    甚至,在Thread.interrupt()被调用后,线程仍然继续运行。

    真正地中断一个线程

        中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务。线程必须周期性的核查这一变量(尤其在冗余操作期间),然后有秩序地中止任务。Listing B描述了这一方式。

    Listing B
    class Example2 extends Thread {

      volatile boolean stop = false;

      public static void main( String args[] ) throws Exception {

        Example2 thread = new Example2();

       System.out.println( "Starting thread..." );

       thread.start();

       Thread.sleep( 3000 );

       System.out.println( "Asking thread to stop..." );

       thread.stop = true;

       Thread.sleep( 3000 );

       System.out.println( "Stopping application..." );

       //System.exit( 0 );

      }

      public void run() {

        while ( !stop ) {

         System.out.println( "Thread is running..." );

          long time = System.currentTimeMillis();

          while ( (System.currentTimeMillis()-time < 1000) && (!stop) ) {

          }

        }

       System.out.println( "Thread exiting under request..." );

      }

    }
     
    运行Listing B中的代码将产生如下输出(注意线程是如何有秩序的退出的)

    Starting thread...

    Thread is running...

    Thread is running...

    Thread is running...

    Asking thread to stop...

    Thread exiting under request...

    Stopping application...

       虽然该方法要求一些编码,但并不难实现。同时,它给予线程机会进行必要的清理工作,这在任何一个多线程应用程序中都是绝对需要的。请确认将共享变量定义成volatile 类型或将对它的一切访问封入同步的块/方法(synchronized blocks/methods)中。

    到目前为止一切顺利!但是,当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时,这里仅举出一些。

    他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。

    很不幸运,不存在这样一种机制对所有的情况都适用,但是,根据情况不同却可以使用特定的技术。在下面的环节,我将解答一下最普遍的例子。

    使用Thread.interrupt()中断线程

      正如Listing A中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

        因此,如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最后线程都将检查共享变量然后再停止。Listing C这个示例描述了该技术。

    Listing C
    class Example3 extends Thread {

      volatile boolean stop = false;

      public static void main( String args[] ) throws Exception {

       Example3 thread = new Example3();

       System.out.println( "Starting thread..." );

       thread.start();

       Thread.sleep( 3000 );

       System.out.println( "Asking thread to stop..." );

       thread.stop = true;//如果线程阻塞,将不会检查此变量

       thread.interrupt();

       Thread.sleep( 3000 );

       System.out.println( "Stopping application..." );

       //System.exit( 0 );

      }

      public void run() {

        while ( !stop ) {

         System.out.println( "Thread running..." );

          try {

          Thread.sleep( 1000 );

          } catch ( InterruptedException e ) {

          System.out.println( "Thread interrupted..." );

          }

        }

       System.out.println( "Thread exiting under request..." );

      }

    }

    一旦Listing C中的Thread.interrupt()被调用,线程便收到一个异常,于是逃离了阻塞状态并确定应该停止。运行以上代码将得到下面的输出:

    Starting thread...

    Thread running...

    Thread running...

    Thread running...

    Asking thread to stop...

    Thread interrupted...

    Thread exiting under request...

    Stopping application...


    处理不可中断的阻塞

    (1)java.io包中的同步Socket I/O

    (2)java.io包中的同步I/O

    (3)Selector的异步I/O

    (4)获取某个锁,例如Lcok类

     可通过继承Thread类,重新改写interrupt方法,关闭套接字(close)。

    http://www.cnblogs.com/simonshi/archive/2011/12/31/2308455.html


    展开全文
  • 中断线程

    2014-01-08 16:26:39
    中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,但是,...
    中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。

    首先,忘掉Thread.stop方法。虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的,这意味着,在未来的JAVA版本中,它将不复存在。

    一些轻率的家伙可能被另一种方法Thread.interrupt所迷惑。尽管,其名称似乎在暗示着什么,然而,这种方法并不会中断一个正在运行的线程(待会将进一步说明),正如Listing A中描述的那样。它创建了一个线程,并且试图使用Thread.interrupt方法停止该线程。Thread.sleep()方法的调用,为线程的初始化和中止提供了充裕的时间。线程本身并不参与任何有用的操作。

    class Example1 extends Thread {
    boolean stop=false;
    public static void main( String args[] ) throws Exception {
    Example1 thread = new Example1();
    System.out.println( "Starting thread..." );
    thread.start();
    Thread.sleep( 3000 );
    System.out.println( "Interrupting thread..." );
    thread.interrupt();
    Thread.sleep( 3000 );
    System.out.println("Stopping application..." );
    //System.exit(0);
    }
    public void run() {
    while(!stop){
    System.out.println( "Thread is running..." );
    long time = System.currentTimeMillis();
    while((System.currentTimeMillis()-time < 1000)) {
    }
    }
    System.out.println("Thread exiting under request..." );
    }
    }


    如果你运行了Listing A中的代码,你将在控制台看到以下输出:

    Starting thread...

    Thread is running...

    Thread is running...

    Thread is running...

    Interrupting thread...

    Thread is running...

    Thread is running...

    Thread is running...

    Stopping application...

    Thread is running...

    Thread is running...

    Thread is running...
    ...............................
    甚至,在Thread.interrupt()被调用后,线程仍然继续运行。

    真正地中断一个线程

    中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务。线程必须周期性的核查这一变量(尤其在冗余操作期间),然后有秩序地中止任务。Listing B描述了这一方式。
    Listing B

    class Example2 extends Thread {

    volatile boolean stop = false;

    public static void main( String args[] ) throws Exception {

    Example2 thread = new Example2();

    System.out.println( "Starting thread..." );

    thread.start();

    Thread.sleep( 3000 );

    System.out.println( "Asking thread to stop..." );

    thread.stop = true;

    Thread.sleep( 3000 );

    System.out.println( "Stopping application..." );

    //System.exit( 0 );

    }

    public void run() {

    while ( !stop ) {

    System.out.println( "Thread is running..." );

    long time = System.currentTimeMillis();

    while ( (System.currentTimeMillis()-time < 1000) && (!stop) ) {

    }

    }


    }

    }

    运行Listing B中的代码将产生如下输出(注意线程是如何有秩序的退出的)

    Starting thread...

    Thread is running...

    Thread is running...

    Thread is running...

    Asking thread to stop...

    Stopping application...

    虽然该方法要求一些编码,但并不难实现。同时,它给予线程机会进行必要的清理工作,这在任何一个多线程应用程序中都是绝对需要的。请确认将共享变量定义成volatile 类型或将对它的一切访问封入同步的块/方法(synchronized blocks/methods)中。

    到目前为止一切顺利!但是,当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时,这里仅举出一些。

    他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。

    很不幸运,不存在这样一种机制对所有的情况都适用,但是,根据情况不同却可以使用特定的技术。在下面的环节,我将解答一下最普遍的例子。

    使用Thread.interrupt()中断线程

    正如Listing A中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

    因此,如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最后线程都将检查共享变量然后再停止。Listing C这个示例描述了该技术。

    Listing C
    class Example3 extends Thread {

    volatile boolean stop = false;

    public static void main( String args[] ) throws Exception {

    Example3 thread = new Example3();

    System.out.println( "Starting thread..." );

    thread.start();

    Thread.sleep( 3000 );

    System.out.println( "Asking thread to stop..." );

    thread.stop = true;//如果线程阻塞,将不会检查此变量

    thread.interrupt();

    Thread.sleep( 3000 );

    System.out.println( "Stopping application..." );

    //System.exit( 0 );

    }

    public void run() {

    while ( !stop ) {

    System.out.println( "Thread running..." );

    try {

    Thread.sleep( 1000 );

    } catch ( InterruptedException e ) {

    System.out.println( "Thread interrupted..." );
    Thread.currentThread().interrupt();// 要加上这一句

    }

    }

    }

    }


    一旦Listing C中的Thread.interrupt()被调用,线程便收到一个异常,于是逃离了阻塞状态并确定应该停止。运行以上代码将得到下面的输出:

    Starting thread...

    Thread running...

    Thread running...

    Thread running...

    Asking thread to stop...

    Thread interrupted...

    Stopping application...


    中断I/O操作
    然而,如果线程在I/O操作进行时被阻塞,又会如何?I/O操作可以阻塞线程一段相当长的时间,特别是牵扯到网络应用时。例如,服务器可能需要等待一个请求(request),又或者,一个网络应用程序可能要等待远端主机的响应。

    如果你正使用通道(channels)(这是在Java 1.4中引入的新的I/O API),那么被阻塞的线程将收到一个ClosedByInterruptException异常。如果情况是这样,其代码的逻辑和第三个例子中的是一样的,只是异常不同而已。

    但是,你可能正使用Java1.0之前就存在的传统的I/O,而且要求更多的工作。既然这样,Thread.interrupt()将不起作用,因为线程将不会退出被阻塞状态。Listing D描述了这一行为。尽管interrupt()被调用,线程也不会退出被阻塞状态

    Listing D
    import java.io.*;

    class Example4 extends Thread {

    public static void main( String args[] ) throws Exception {

    Example4 thread = new Example4();

    System.out.println( "Starting thread..." );

    thread.start();

    Thread.sleep( 3000 );

    System.out.println( "Interrupting thread..." );

    thread.interrupt();

    Thread.sleep( 3000 );

    System.out.println( "Stopping application..." );

    //System.exit( 0 );

    }

    public void run() {

    ServerSocket socket;

    try {

    socket = new ServerSocket(7856);

    } catch ( IOException e ) {

    System.out.println( "Could not create the socket..." );

    return;

    }

    while ( true ) {

    System.out.println( "Waiting for connection..." );

    try {

    Socket sock = socket.accept();

    } catch ( IOException e ) {

    System.out.println( "accept() failed or interrupted..." );
    Thread.currentThread().interrupt();// 要加上这一句

    }

    }

    }

    }



    很幸运,Java平台为这种情形提供了一项解决方案,即调用阻塞该线程的套接字的close()方法。在这种情形下,如果线程被I/O操作阻塞,该线程将接收到一个SocketException异常,这与使用interrupt()方法引起一个InterruptedException异常被抛出非常相似。

    唯一要说明的是,必须存在socket的引用(reference),只有这样close()方法才能被调用。这意味着socket对象必须被共享。Listing E描述了这一情形。运行逻辑和以前的示例是相同的。

    Listing E
    import java.net.*;
    import java.io.*;
    class Example5 extends Thread {
    volatile boolean stop = false;
    volatile ServerSocket socket;
    public static void main( String args[] ) throws Exception {
    Example5 thread = new Example5();
    System.out.println( "Starting thread..." );
    thread.start();
    Thread.sleep( 3000 );
    System.out.println( "Asking thread to stop..." );
    thread.stop = true;
    thread.socket.close();
    Thread.sleep( 3000 );
    System.out.println( "Stopping application..." );
    //System.exit( 0 );
    }
    public void run() {
    try {
    socket = new ServerSocket(7856);
    } catch ( IOException e ) {
    System.out.println( "Could not create the socket..." );
    return;
    }
    while ( !stop ) {
    System.out.println( "Waiting for connection..." );
    try {
    Socket sock = socket.accept();
    } catch ( IOException e ) {
    System.out.println( "accept() failed or interrupted..." );
    }
    }
    System.out.println( "Thread exiting under request..." );
    }
    }

    以下是运行Listing E中代码后的输出:

    Starting thread...

    Waiting for connection...

    Asking thread to stop...

    accept() failed or interrupted...

    Thread exiting under request...

    Stopping application...

    转自:[url]http://blog.csdn.net/chulaixi/article/details/3018531[/url],没事看看
    展开全文
  • 线程中断

    2015-12-16 21:55:00
    线程中断是一种协作机制,线程可以通过这种机制来通知另一个线程,告诉他在合适的或者可能的情况下停止当前工作,并转而执行其他的工作。 通过中断并不能直接终止另一个线程,而需要被中断线程自己处理中断。 ...

           线程中断是一种协作机制,线程可以通过这种机制来通知另一个线程,告诉他在合适的或者可能的情况下停止当前工作,并转而执行其他的工作。

          通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。

          这好比是家里的父母叮嘱在外的子女要注意身体,但子女是否注意身体,怎么注意身体则完全取决于自己。

    ‍‍‍‍‍‍‍每一个线程都有一个boolean类型的中断状态。当中断线程时,这个线程的中断状态将被设置为true。‍‍‍‍‍‍在Thread中包含了中断线程以及查询线程中断状态的方法      Java中断模型也是这么简单,每个线程对象里都有一个boolean类型的标识(不一定就要是Thread类的字段,实际上也的确不是,这几个方法最终都是通过native方法来完成的),代表着是否有中断请求(该请求可以来自所有线程,包括被中断的线程本身)。例如,当线程t1想中断线程t2,只需要在线程t1中将线程t2对象的中断标识置为true,然后线程2可以选择在合适的时候处理该中断请求,甚至可以不理会该请求,就像这个线程没有被中断一样。

    Thread中的中断方法:

    public void interrupt():能中断目标线程(interrupt方法仅仅只是将中断状态置为true)

    public boolean isInterrupted():返回目标线程的中断状态

    public static boolean interrupted():将清除当前线程的中断状态,并返回它之前的值,这也是清除中断状态的唯一方法

    一、interrupt

          interrupt()仅仅是置线程的中断状态位 ,不会停止线程,需要用户自己去监视线程的状态为并做出相应的处理。这一方法实际上完成的是:在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态

        更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
        如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。
        线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,这时候A会有InterruptedException异常抛出来.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。
        如果线程A正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程A不会抛出InterruptedException,而会一直执行着自己的操作.当线程A终于执行到wait(),sleep(),join()时,才马上会抛出InterruptedException.
        若没有调用sleep(),wait(),join()这些方法,或是没有在线程里自己检查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的.

    二、interrupted

          测试当前线程是否已经中断,在返回线程的状态位后,线程的中断状态由该方法清除(要清掉原来的状态位--恢复成原来情况)。

          interrupted是静态方法,返回的是当前线程的中断状态。例如,如果当前线程被中断(没有抛出中断异常,否则中断状态就会被清除),你调用interrupted方法,第一次会返回true。然后,当前线程的中断状态被方法内部清除了。第二次调用时就会返回false。

    三、isInterrupted

         测试线程是否已经中断。线程的中断状态不受该方法的影响。

    四、Shutdown()与ShutdownNow()的区别

    shutDown():当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出;

    shutdownNow():根据JDK文档描述,大致意思是:执行该方法,线程池的状态立刻变成STOP状态,并试图停止所有正在执行的线程,不再处理还在池队列中等待的任务,当然,它会返回那些未执行的任务。 它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。

    原理可以参考:http://wiki.jikexueyuan.com/project/java-concurrency/thread-interrupt.html

    转载于:https://www.cnblogs.com/moonandstar08/p/5052476.html

    展开全文
  • 1.0线程 线程中断

    2020-02-16 01:03:36
    isinterrupted : 返回Boolean 类型 ,显示当前线程是否被中断的状态 interrupted 方法:检查 并 清除中断标识位 调用完该方法之后 使 isinterrupted 为false package cn.test.Thead; public...

    线程的中断

    01强制性中断:
    线程的暂时:suspend()
    恢复:resume()
    停止:stop()
    以上为旧有线程Thread API中的内容,因在调用后,线程不会释放已占有资源(锁),已发生死锁等现象已不建议使用。

    02协同式中断:
    interrupt 方法 :设置中断标识位,对线程进行中断尝试
    isinterrupted : 返回Boolean 类型 ,显示当前线程是否被中断的状态
    interrupted 方法:检查 并 清除中断标识位 调用完该方法之后 使 isinterrupted 为false

    package cn.test.Thead;
    
    public class endThead {
    
        private  static  class  UseThead extends Thread{
    
            public  UseThead (String name){
                super(name);
            }
    
            @Override
            public void run() {
                String threadName = Thread.currentThread().getName(); //获取当前线程.name
                System.out.println(threadName+"开始状态 interrupt flag :"+isInterrupted()); //开始状态
                //while ( ! isInterrupted()){
                    while (! interrupted()){
                    System.out.println(threadName+" is running");
                    System.out.println(threadName+"运行状态 interrupt flag=" + isInterrupted() );
                }
                System.out.println( "最终状态 "+isInterrupted());
                //super.run();
            }
    
    
            public static void main(String[] args) throws InterruptedException {
                Thread endThread = new UseThead("endThread");
                endThread.start(); //开启线程
                Thread.sleep(10); // 线程睡眠 但是 interrupt 仍然会被侦测
               // System.out.println("sss");
                endThread.interrupt();
            }
        }
    }
    
    

    拓展:阻塞方法中抛出InterruptedException异常后,如果需要继续中断,需要手动再中断一次
    留给程序员做 干预时间,手短判断是否要中断线程。

    /**
     *类说明:阻塞方法中抛出InterruptedException异常后,如果需要继续中断,需要手动再中断一次
     */
    public class HasInterrputException {
    	
    	private static class UseThread extends Thread{
    		
    		public UseThread(String name) {
    			super(name);
    		}
    		
    		@Override
    		public void run() {
    			while(!isInterrupted()) {
    				try {
    					Thread.sleep(100);
    				} catch (InterruptedException e) {
    					System.out.println(Thread.currentThread().getName()
    							+" in InterruptedException interrupt flag is "
    							+isInterrupted());
    					interrupt(); //手动资源释放 需要时执行
    					e.printStackTrace();
    				}
    				System.out.println(Thread.currentThread().getName()
    						+ " I am extends Thread.");
    			}
    			System.out.println(Thread.currentThread().getName()
    					+" interrupt flag is "+isInterrupted());
    		}
    	}
    
    	public static void main(String[] args) throws InterruptedException {
    		Thread endThread = new UseThread("HasInterrputEx");
    		endThread.start();
    		Thread.sleep(500);
    		endThread.interrupt();
    		
    
    	}
    
    }
    

    补充:死锁状态线程不会理会中断

    展开全文
  • 线程--中断线程

    2017-07-17 15:23:00
    一 . 在java中有以下三种方法可以停止正在运行的线程: 1 .使用退出标志使线程正常退出,也就是当run方法完成后线程终止2 ....使用interrupt()方法终止线程(注意:interrupt方法并不会马上停止当前线程,...
  • 中断一个线程

    2020-06-08 15:43:10
    中断一个线程可能有两种情况: 1.让线程run执行完 2.调用线程的interrupt方法 1.让线程run执行完,结束方式比较温和。当标记位被设置上之后,等到当前这次循环执行完了之后,再结束线程。 public class ThreadDemo...
  • 除非当前线程正在中断自身(通常允许这样做),否则将调用此线程的checkAccess方法,这可能会引发SecurityException。 如果该线程阻塞于调用Object类的wait(),wait(long)或wait(long,int)方法或该线程的join(),...
  • 线程中断机制

    万次阅读 热门讨论 2017-08-18 12:02:55
    在 java中启动线程非常容易,大多数情况下是让一个线程执行完自己的任务然后自己停掉... 在当前的api中,Thread.suspend、Thread.stop等方法都被Deprecated了,线程只能用interrupt中断,而且不是立刻中断,只是发了一
  • boost线程中断

    千次阅读 2017-04-14 11:38:14
    这个线程会执行一个任务,whatever,可能是下载一个大文件吧,然后在下载过程中需要在窗口上实时刷新当前进度。 而在下载过程中“退出”按钮随时可能被点击,这时要求要先退出线程,再退出应用程
  • linux 中断线程

    2014-05-30 17:13:01
    一、原理 中断处理是由内核执行的最敏感的任务之一,当内核正打算往做一些别的事情时,中断随时会到来,中断当前的任务进而执行中断处理程序。因此内核的目标就是让中断尽可能快的处理完,尽其所能把更多的处理工作...
  • java 中断线程研究

    2012-09-18 16:33:52
    背景 中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,...
  • 线程(3),线程中断

    2020-06-08 22:56:15
    当我们想结束一个正在运行的线程的时候,也就是说中断让一个线程结束,结束的情况可能有两种情况 让线程执行完当前的任务后在去结束 public class Test3 { //这种结束方法比较温和,当标记位被标记后结束当前...
  • 一、什么是线程切换,线程阻塞,线程中断?...也就是说,若是当前线程的优先级足够高的话,那么就有可能在下一次的CPU调度中再次获得一个时间片。若是当前线程未能再次获得时间片,那么它就要插入...
  • 中断线程Interrupt()

    2014-05-14 11:54:07
     中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,但是...
  • 在 java中启动线程非常容易,大多数情况下是让一个线程执行完自己的任务然后自己停...在当前的api中,Thread.suspend、Thread.stop等方法都被Deprecated了,线程只能用interrupt中断,而且不是立刻中断,只是发了一...
  • 线程中断——学习三

    2017-05-22 16:51:19
    如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int...
  • 线程的取消和中断

    2016-04-10 10:46:27
    一、通过设置“cancelled requested”标志来中断线程 java中的任务取消实现:  是通过一个协作机制完成的,使用一个线程能够要求另一个线程停止当前的工作。  这样做的原因是:  如果直接要求一个任务、...
  • 中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,但是,...
  • 如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的checkAccess()方法就会被调用,这可能抛出SecurityException 如果线程在调用Object类的wait()、wait(long)或者wait(long, int)方法,或者该类...
  • Java 线程阻塞、中断及优雅退出

    千次阅读 2018-07-18 20:39:44
    sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; 当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠...
  • 有几处你已经看出,这是不可取的,因为之后你必须管理线程对象的生命期,以及确定适合该问题的线程数和当前的硬件,等等。理想的情况是,你可以最大程度的将代码分成可以并行执行的小块,把它们交给编译器和标准库,...
  • Thread.stop()方法 此方法虽然可以立即停止线程,但是是不安全的方法。...调用此方法会在当前线程中打一个停止的标记,并不会真正的停止线程。 要想真正的停止线程,还需要结合interrupted()或isInterrupte...
  • 如果你使用过杀毒软件,可能会发现全盘杀毒太耗时间了,这时你如果...每一个线程都有一个boolean类型标志,用来表明当前线程是否请求中断,当一个线程调用interrupt() 方法时,线程的中断标志将被设置为true。 我们...
  • 1 停止线程相关的重要函数 ...Thread.interrupted()的方法的目标对象是”当前线程“,而不管方法来自于哪个对象 1.1 如何分析 native 方法 https://github.com/openjdk-mirror/jdk7u-jdk ...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 243
精华内容 97
关键字:

可能中断当前线程