精华内容
下载资源
问答
  • 线程停止执行

    2020-04-27 20:53:38
    sleep()线程结束休眠后会进入Runnable状态,也就是停止执行了。要再次被调度程序选中然后获得cpu时间片才会被执行。Thread.sleep(0)就是个很好的例子,就是大家再抢一次cpu时间片。sleep()是线程本身的静态方法,...

    sleep()线程结束休眠后会进入Runnable状态,也就是停止执行了。要再次被调度程序选中然后获得cpu时间片才会被执行。Thread.sleep(0)就是个很好的例子,就是让大家再抢一次cpu时间片。sleep()是线程本身的静态方法,谁调用谁休眠,就算a线程调用b线程的sleep也是a线程休眠。
    另外join方法调用后会等待线程执行完成后又会进入Runnable状态 等待用户输入的线程,用户输入之后也会重新进入Runnable状态 以上三种都是blocked状态的三种情况 另外synchronized修饰的方法和类,会让没抢到锁的线程停止执行,yield是让当前执行的线程让出cpu时间片(并不是线程本身的方法),也算让线程停止执行了。只要不是Running状态都是停止执行了。

    展开全文
  • Java让线程停止的方法

    千次阅读 2017-04-06 10:30:14
    线程停止大家所熟知的有三种:stop、volatile、interrupt stop:建议不要用,当线程正在进行一些耗时操作如读写,突然终止很可能会有错误发生 interrupt:建议不要用,当线程进入阻塞如 Thread.sleep(5000);调用...

    好久没写blog了,这段时间没怎么学习有一点点荒废,最近心血来潮,想要重新开写博客,当做自己的成长日记和技术笔记吧。。。。。


    最近花精力去了解了一下java线程,今天记录一下线程停止的方法。java线程停止大家所熟知的一般有三种:stop、volatile、interrupt,下面我来分别介绍一下它们:


    stop:建议不要用,会让线程戛然而止,无法得知线程完成了什么、没完成什么,当线程正在进行一些耗时操作如读写、数据库操作,突然终止很可能会有错误发生


    interrupt:建议不要用,当线程进入阻塞如 Thread.sleep(5000);调用interrupt会抛出异常,而且线程不会停止

    错误案例:

    class TestThread extends Thread {
    
    	private int count = 0;
    	
    	public void run() {
    		while(!this.isInterrupted()){
    			
    			System.out.print("\n TestThread " + count++);
    			
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    }
    
    
    public class Main {
    	
    	public static void main(String args[]){
    		
    		Thread thread = new TestThread();
    		thread.start();
    		
    		try {
    			Thread.sleep(3000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.print("\n parpare to interrupt the thread ");
    		thread.interrupt();
    		
    	}
    }
    运行结果:抛出了异常,而且线程未停止

     TestThread 0
     TestThread 1
     TestThread 2
     parpare to interrupt the thread java.lang.InterruptedException: sleep interrupted
    
     TestThread 3	at java.lang.Thread.sleep(Native Method)
    	at TestThread.run(Main.java:11)
    
     TestThread 4
     TestThread 5
     TestThread 6
     TestThread 7

    volatile:建议使用,线程会执行完当前操作后停止。

    正确案例1:

    class TestRunnable implements Runnable{
    
    	volatile boolean isRunning = true;
    	int count = 0;
    	public void run() {
    		while(isRunning){
    			
    			System.out.print("\n RunThread "+ count++);
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    		}
    		
    		
    	}
    	
    }
    
    
    public class Main {
    	
    	public static void main(String args[]){
    		
    		TestRunnable run = new TestRunnable();
    		Thread thread = new Thread(run,"runnable");
    		thread.start();
    		
    		try {
    			Thread.sleep(5000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.print("\n parpare to stop the thread ");
    		run.isRunning = false;
    		
    	}
    }


    运行结果:

     RunThread 0
     RunThread 1
     RunThread 2
     RunThread 3
     RunThread 4
     RunThread 5
     parpare to stop the thread 


    正确案例(2):

    class TestThread extends Thread {
    
    	private int count = 0;
    	volatile boolean isRunning = true;
    	
    	public void run() {
    		while(isRunning){
    			
    			System.out.print("\n TestThread " + count++);
    			
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    }
    public class Main {
    	
    	public static void main(String args[]){
    				
    		TestThread tt = new TestThread();
    		tt.start();
    		try {
    			Thread.sleep(5000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.print("\n parpare to stop the thread ");
    		tt.isRunning = false;
    		
    		
    	}
    }
    运行结果:

     TestThread 0
     TestThread 1
     TestThread 2
     TestThread 3
     TestThread 4
     TestThread 5
     parpare to stop the thread 


    好了,差不多就是这些了,大家有什么问题、建议可以留言。


    展开全文
  • 实例代码如下:100个线程连续执行一分钟后停止执行。 public class Print implements Runnable{ public void run() { long t = System.currentTimeMillis();//系统一开始的运行时间复制给t,精确到毫秒...
  • 而使用睡眠sleep()方式,可以让线程从当前开始睡眠指定的时间。注意不要使用睡眠sleep()方式去代替等待wait()或通知notify(),反之亦然。 等待wait()或通知notify()不应该用于暂停线程,还有一个原因,等待wait()或...
  • 大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法后线程就立刻停止了吗?...

    大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法后线程就立刻停止了吗? 答案是:不是!

     

    下面我们来解释一下Abort方法是如何工作的。因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abort方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管的代码而且还没有返回的话,该线程就不会立即终止。而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。不过这种情况只是一些特例,更多的情况是目标线程在调用托管的代码,一旦Abort被调用那么该线程就立即终止了。

     

    其实一个线程在运行时,我们可以通过Thread.ThreadState属性读出它的状态,正在运行的线程状态就是ThreadState.Running。然后如果我们想强制停止正在执行的线程,就会调用Thread.Abort方法,但是Thread.Abort方法做的事情只是在线程上抛出了一个ThreadAbortException异常,然后将线程的状态置为ThreadState.AbortRequested,MSDN对AbortRequested状态的解释是:已对线程调用了 Thread.Abort 方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException,也就是说线程在ThreadState.AbortRequested状态时表示即将结束但是还没有真正结束。可是Thread.Abort方法将线程的状态置为ThreadState.AbortRequested后就立马返回了,而线程真正结束后的状态应该是ThreadState.Aborted,所以一定要注意在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值或者调用Thread.Join方法来确保被终止线程已经真正停止,只有当Thread.ThreadState属性为Aborted或Thread.Join方法返回时,才表示线程真正结束了。

     

    下面我就写一个示例代码来说明在调用Thread.Abort方法后,怎样保证线程停止后代码才会继续执行

     

    var thread = new Thread(
        new ThreadStart(
            () =>
                {
                    while (true)
                    {
                        //该线程会进行无限循环,自己不会结束
                        Thread.Sleep(100);
                    }
                }));
    
    thread.IsBackground = true;
    thread.Start();//启动线程
    
    thread.Abort();//调用Thread.Abort方法试图强制终止thread线程
    
    //上面调用Thread.Abort方法后线程thread不一定马上就被终止了,所以我们在这里写了个循环来做检查,看线程thread是否已经真正停止。其实也可以在这里使用Thread.Join方法来等待线程thread终止,Thread.Join方法做的事情和我们在这里写的循环效果是一样的,都是阻塞主线程直到thread线程终止为止
    while (thread.ThreadState!=ThreadState.Aborted)
    {
        //当调用Abort方法后,如果thread线程的状态不为Aborted,主线程就一直在这里做循环,直到thread线程的状态变为Aborted为止
        Thread.Sleep(100);
    }
    
    //当跳出上面的循环后就表示我们启动的线程thread已经完全终止了

     

    不过请记住使用Thread.Abort方法来终止正在执行的线程并不是一个好的方法,因为Abort方法是通过在线程上抛异常来终止线程的,这样可能会产生一些意想不到的问题。最好的办法是在启动的线程中加信号灯,当想要终止线程执行时就更改信号灯的状态,启动的线程当读到信号灯状态改变后自己结束代码的执行,这才是最安全的做法。

     

     

    原文链接:https://www.cnblogs.com/OpenCoder/p/4587249.html

    转载于:https://www.cnblogs.com/Liyuting/p/9087287.html

    展开全文
  • java中,线程池中的多线程如何防止还没执行完成的线程过期停止呢? 如线程过期时间设置为30分钟,但是下载数据超过了30分钟,这是如何这个下载数据的线程下载完数据再停止呢?
  • 大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法后线程就立刻停止了吗?...

    大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法后线程就立刻停止了吗? 答案是:不是!

     

    下面我们来解释一下Abort方法是如何工作的。因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abort方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管的代码而且还没有返回的话,该线程就不会立即终止而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。不过这种情况只是一些特例,更多的情况是目标线程在调用托管的代码,一旦Abort被调用那么该线程就立即终止了。

     

    其实一个线程在运行时,我们可以通过Thread.ThreadState属性读出它的状态,正在运行的线程状态就是ThreadState.Running。然后如果我们想强制停止正在执行的线程,就会调用Thread.Abort方法,但是Thread.Abort方法做的事情只是在线程上抛出了一个ThreadAbortException异常,然后将线程的状态置为ThreadState.AbortRequested,MSDN对AbortRequested状态的解释是:已对线程调用了 Thread.Abort 方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException,也就是说线程在ThreadState.AbortRequested状态时表示即将结束但是还没有真正结束。可是Thread.Abort方法将线程的状态置为ThreadState.AbortRequested后就立马返回了,而线程真正结束后的状态应该是ThreadState.Aborted,所以一定要注意在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值或者调用Thread.Join方法来确保被终止线程已经真正停止,只有当Thread.ThreadState属性为Aborted或Thread.Join方法返回时,才表示线程真正结束了。

     

    下面我就写一个示例代码来说明在调用Thread.Abort方法后,怎样保证线程停止后代码才会继续执行

    var thread = new Thread(
        new ThreadStart(
            () =>
                {
                    while (true)
                    {
                        //该线程会进行无限循环,自己不会结束
                        Thread.Sleep(100);
                    }
                }));
    
    thread.IsBackground = true;
    thread.Start();//启动线程
    
    thread.Abort();//调用Thread.Abort方法试图强制终止thread线程
    
    //上面调用Thread.Abort方法后线程thread不一定马上就被终止了,所以我们在这里写了个循环来做检查,看线程thread是否已经真正停止。其实也可以在这里使用Thread.Join方法来等待线程thread终止,Thread.Join方法做的事情和我们在这里写的循环效果是一样的,都是阻塞主线程直到thread线程终止为止
    while (thread.ThreadState!=ThreadState.Aborted)
    {
        //当调用Abort方法后,如果thread线程的状态不为Aborted,主线程就一直在这里做循环,直到thread线程的状态变为Aborted为止
        Thread.Sleep(100);
    }
    
    //当跳出上面的循环后就表示我们启动的线程thread已经完全终止了

     

     

    不过请记住使用Thread.Abort方法来终止正在执行的线程并不是一个好的方法,因为Abort方法是通过在线程上抛异常来终止线程的,这样可能会产生一些意想不到的问题。最好的办法是在启动的线程中加信号灯,当想要终止线程执行时就更改信号灯的状态,启动的线程当读到信号灯状态改变后自己结束代码的执行,这才是最安全的做法。

    转载于:https://www.cnblogs.com/OpenCoder/p/4587249.html

    展开全文
  • 42. 线程停止

    2018-04-29 16:18:00
    线程停止无外乎2种,要么是执行完了任务,要么强制停止 线程的停止:  1.我们可以定义一个boolean类型的变量结合notity方法去控制线程的停止(使用notity是为了防止要被停止的线程wait)  2.也可以使用...
  • 多个线程共同竞争CPU时,存在多种分配策略,但是每种策略下每个线程只是在很短的时间内占有cpu,这段时间就是时间片,到了线程的时间片,就开始执行任务,一旦时间片结束,资源立马被释放,任务也停止,别的线程获得...
  • 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会整个程序freeze,直到你continue这个线程,程序中的其他线程才会继续运行。这个限制使得被调试...
  • 在指定的毫秒数内当前正在执行线程休眠 void join() 等待该线程终止 static void yield 暂停当前正在执行线程对象,并执行其他线程 void interrupt() 中断线程,不建议使用 boolean isAlive() 测试...
  • 场景1.多线程应用里, 线程基本上都是出自线程池, 那么基本...自行设计的可预测伪线程停止,其实就是停止执行当前的业务逻辑,并不是终止线程, 让线程回归线程池. 目前我发现的方案基本上离不开对状态变量的判断. (比较忙
  • Java多线程停止线程

    2019-08-08 19:09:34
    停止线程,就是在线程正在处理指定任务的过程中,人为的不它在继续执行下去,放弃当前的操作。停止线程看起来很简单,但是要想达到预期效果,就必须做好防范措施。 停止线程的3种方式: 1.使用退出标志,是线程...
  • 多个线程共同竞争CPU时,存在多种分配策略,但是每种策略下每个线程只是在很短的时间内占有cpu,这段时间就是时间片,到了线程的时间片,就开始执行任务,一旦时间片结束,资源立马被释放,任务也停止,别的线程获得...
  • 线程休眠:让线程暂缓执行一下,等到预计时间之后再恢复执行。线程休眠会交出CPU,并让CPU执行其它的任务。 sleep()不会释放锁,即如果当前线程持有对某个对象的锁,即使调用sleep(),其它线程也无法访问这个对象...
  • 一般情况下,线程自然执行完或抛出异常时会停止工作,那么如何主动让线程安全停止呢? stop()停止方法、resume()继续执行方法、suspend()挂起方法 这三个方法在早期的时候是有的,但现在已被废弃。因为这些方法过于...
  • 线程停止

    2017-03-22 10:20:15
    线程的停止:通过stop方法就可以停止线程。但是这个方式过时了。 停止线程:原理就是:让线程运行的代码结束,也就是结束run方法。 怎么结束run方法?一般run方法里肯定定义循环。...让线程恢复具备执行
  • 停止线程

    2017-05-02 17:49:33
     停止线程推荐的方式:设定一个标志变量,在run()方法中是一个循环,由该标志变量控制循环是继续执行还是跳出;循环跳出,则线程结束。  如代码例子中所示: public class ControlThreadTest { MyT
  • 我在软件中定义了一个定时器,循环执行一个方法 然后我在其他方法中又定义了一个循环,当循环执行时,定时器就停止执行了 有什么方法可以定时器与循环同步执行 求大神帮忙解答
  • 礼让线程当前正在执行线程暂停,但不阻塞 将线程从运行状态转为就绪状态 CPU重新调度,即重新加入就绪队列,礼让不一定成功,看CPU的调度策略 public class TestYield { public static void main(String[]...
  • 一个进程的主线程是由操作系统自动生成,如果你要一个主线程创建额外的线程,可以通过ACE_Thread::spawn()实现,该函数一般的使用方式如下: ACE_thread_tthreadId; ACE_hthread_tthreadHandle; ACE_Thread::...
  • java线程停止的方法

    2016-05-29 12:18:30
    之前介绍过,停机线程可以使用interrupte ,可以用标记,run执行结束。现在我们来看几个方法。 方法1、使用interrupte方法来执行,通过抛出InterruptedException来结束run运行。packagesecondThreadStudy; import...
  • 1、一个线程正在执行一个无线循环的任务,怎样其停下来? @RestController public class VolatileController { private Thread1 t1; @Autowired private ProductService productService; @RequestMapping("/...
  • java多线程停止线程

    2016-07-12 21:00:00
    两个线程都冻结了,就不能唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出的时候,里面的两个线程都处于冻结状态,这样就卡住了5.try catch 有异常,catch...
  • 1 sleep() 和 wait() void wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程...可以让线程处于冻结状态 不同点: (1)sleep()必须要指定时间,wait()可以指定时间,也可以不指定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 593
精华内容 237
关键字:

让线程停止执行