精华内容
下载资源
问答
  • 2021-04-12 22:16:46

    package Threads; import java.util.concurrent.TimeUnit; public class ThreadRunning { static class MyRunnable implements Runnable { private void method1() { for(int i=0;i<3;i++){ try{ TimeUnit.SECONDS.sleep(1); }catch(InterruptedException ex){} method2(); } System.out.println("Existing Method1"); } private void method2() { for(int i=0;i<2;i++){ try{ TimeUnit.SECONDS.sleep(1); }catch(InterruptedException ex){} method3(); } System.out.println("Existing Method2"); } private void method3() { for(int i=0;i<1;i++){ try{ TimeUnit.SECONDS.sleep(1); }catch(InterruptedException ex){} } System.out.println("Existing Method3"); } public void run(){ method1(); } } public static void main(String[] args) { MyRunnable runMe=new MyRunnable(); Thread aThread=new Thread(runMe,"Thread A"); aThread.start(); monitorThread(aThread); } public static void monitorThread(Thread monitorMe) { while(monitorMe.isAlive()) { try{ StackTraceElement[] threadStacktrace=monitorMe.getStackTrace(); System.out.println(monitorMe.getName() +" is Alive and it's state ="+monitorMe.getState()+" || Execution is in method : ("+threadStacktrace[0].getClassName()+"::"+threadStacktrace[0].getMethodName()+") @line"+threadStacktrace[0].getLineNumber()); TimeUnit.MILLISECONDS.sleep(700); }catch(Exception ex){} /* since threadStacktrace may be empty upon reference since Thread A may be terminated after the monitorMe.getStackTrace(); call*/ } System.out.println(monitorMe.getName()+" is dead and its state ="+monitorMe.getState()); } }

    更多相关内容
  • 易语言判断线程是否运行结束源码,判断线程是否运行结束,子程序1
  • 即看即用 1、向线程发送向线程...2、判断线程是否在运行 int kill_rc = pthread_kill(thread_id,0); if(kill_rc == ESRCH) printf("the specified thread did not exists or already quit\n"); else if(kill_r

    目录

    即看即用

    1、向线程发送向线程发送signal

    2、判断线程是否在运行

    详细说明


    即看即用

    1、向线程发送向线程发送signal

    int pthread_kill(pthread_t thread, int sig);

    线程内用signal()去抓信号并加上处理函数。

    2、判断线程是否在运行

    int kill_rc = pthread_kill(thread_id,0);
    
    if(kill_rc == ESRCH)
    
    printf("the specified thread did not exists or already quit\n");
    
    else if(kill_rc == EINVAL)
    
    printf("signal is invalid\n");
    
    else
    
    printf("the specified thread is alive\n");
    
    上述的代码就可以判断线程是不是还活着了。

    详细说明

    pthread_kill:

            别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数。

    int pthread_kill(pthread_t thread, int sig);

    向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。

    pthread_kill(threadid, SIGKILL)也一样,杀死整个进程。

    如果要获得正确的行为,就需要在线程内实现signal(SIGKILL,sig_handler)了。

    所以,如果int sig的参数不是0,那一定要清楚到底要干什么,而且一定要实现线程的信号处理函数,否则,就会影响整个进程。

    OK,如果int sig是0呢,这是一个保留信号,一个作用是用来判断线程是不是还活着。

    我们来看一下pthread_kill的返回值:

    成功:0

    线程不存在:ESRCH

    信号不合法:EINVAL

    所以,pthread_kill(threadid,0)就很有用啦。

    int kill_rc = pthread_kill(thread_id,0);

    if(kill_rc == ESRCH)

    printf("the specified thread did not exists or already quit\n");

    else if(kill_rc == EINVAL)

    printf("signal is invalid\n");

    else

    printf("the specified thread is alive\n");

    上述的代码就可以判断线程是不是还活着了。

    展开全文
  • 易语言判断线程是否运行结束源码
  • 易语言源码易语言判断线程是否运行结束源码.rar
  • 易语言判断多个线程运行结束源码
  • linux c++ 守护线程判断程序是否运行,不存在就启动
  • Tread类中提供了两种方法来判断线程的状态是不是停止的。this.interrupted():测试当前线程是否已经中断。this.isInterrupted():测试线程是否已经中断。1)interrupted()方法:interrupted()方法是静态的方法,方法...

    Tread类中提供了两种方法来判断线程的状态是不是停止的。

    this.interrupted():测试当前线程是否已经中断。

    this.isInterrupted():测试线程是否已经中断。

    1)interrupted()方法:

    interrupted()方法是静态的方法,方法返回值为boolean型,调用该方法的线程的状态为将被置为"中断"状态。下面用两个例子来说明它和isInterrupted()方法的区别:

    我们写了个Test2.java的类,如下:

    public class Test2 extends Thread {

    public void run() {

    super.run();

    for(int i=0;i<5000;i++){

    System.out.println("i="+(i+1));

    }

    }

    public class Test1 {

    public static void main(String[] args) {

    Thread.currentThread().interrupt();

    System.out.println("线程是否停止1?="+Thread.interrupted());

    System.out.println("线程是否停止2?="+Thread.interrupted());

    System.out.println("end!");

    }

    }

    }

    一个Text1.java的类

    public class Test1 {

    public static void main(String[] args) {

    try {

    Test2 thread=new Test2();

    thread.start();

    Thread.sleep(2000);

    thread.interrupt();

    System.out.println("线程是否停止1?="+thread.interrupted());

    System.out.println("线程是否停止2?="+thread.interrupted());

    } catch (InterruptedException e) {

    System.out.println("main catch");

    e.printStackTrace();

    }

    System.out.println("end!");

    }

    }控制台打印的结果:

    0818b9ca8b590ca3270a3433284dd417.png

    从控制台中可以看出,线程并未停止,因为此时的当前线程指的是"main",它从未中断过,因此打印两个false结果。

    那么如何使main线程产生中断的效果呢?下面我们尝试一下:

    public class Test1 {

    public static void main(String[] args) {

    Thread.currentThread().interrupt();

    System.out.println("线程是否停止1?="+Thread.interrupted());

    System.out.println("线程是否停止2?="+Thread.interrupted());

    System.out.println("end!");

    }

    }

    控制台结果显示:

    0818b9ca8b590ca3270a3433284dd417.png

    interrupt()是用来设置中断状态的。返回true说明中断状态被设置了而不是被清除了。

    那为什么第二个boolean值是false呢?原因是interrupted()方法具有清除功能,所以第二次调用的时候返回的是false。

    2)isInterrupted()方法:

    isInterrupted()方法是一个非静态的返回值为boolean的方法。isInterrupted 是作用于调用该方法的线程对象所对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以在当前线程中去调用另一个线程对象的isInterrupted方法。)

    Thread.currentThread().interrupt(); 这个方法用于清除中断的状态,这样下次调用Thread.interrupted()方法时就会一直返回为true,因为中断标志已经被恢复了。而调用isInterrupted 只是简单的查询中断状态,不会对状态进行修改。

    展开全文
  • 主要介绍了判断Threading.start新线程是否执行完毕的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 判断线程是否执行完成(afterexecute)

    千次阅读 2021-03-18 12:34:41
    本人近来需要servlet里另起线程池,以便控制,因为servlet的线程是不为我们能控制的,所以无奈之下,使用了ThreadPoolExecutor类。 但是有些任务需要自己创建的线程池里执行完了,servlet的程序才继续执行。 ...

    本人近来需要在servlet里另起线程池,以便控制,因为servlet的线程是不为我们能控制的,所以无奈之下,使用了ThreadPoolExecutor类。 但是有些任务需要在自己创建的线程池里执行完了,servlet的程序才继续执行。 本来想着用join(),但是线程池的线程引用拿不到,如果在线程池里设置成员变量,又会引起线程不安全(事实上,join()了也没用,因为线程池的线程是不会结束的,join()等待是无结果的)。 苦于成员变量不能设置,局部变量又不可以夸类传递。。 方法一:如果用某个变量控制循环等待,可以实现功能,但不是我要的结果,因为这样的主线程并不是挂起,只是不断循环等待的,一样需要耗费资源,如果线程过多会非常浪费资源。 方法二:在执行任务的程序的run()方法的最后用wait/notify,唤醒主线程,真正实现了异步,主线程并不多耗费资源。缺点是不够灵活,例如:更改了执行的任务,就必须在新任务的run()方法后加入唤醒操作,不能做到与任务无关,所以有了第三种方法。 方法三:用wait/notify和挂钩程序及反射机制的应用,实现了线程池间的通信控制。下面的程序就是介绍第三种方法的。主程序(main函数可模拟是servlet的doPost(),只要保证该类线程安全即可):

    另见CSDN的一个文章,这个文章有代码,实现上述第三种思路

    答:isEndTask()用while(true){..}来判别所有线程已执行结束,否则程序就不许往下执行.while(true){..}在多线程中是很浪费CPU的,从而使得线程池中各个线程得到很少的CPU机会去执行自己各自的任务。因此影响了线程池的优势的发挥。

    那如何改进代码呢?

    我的建议是:

    1)从ThreadPoolExecutor继承,定制它的回调方法:

    protected void afterExecute(Runnable r, Throwable t),在该方法的代码中,判getActiveCount() 是不是 0,若是0,则置boolean 型变量hasFinished=true;并发出notifyAll()通知,通知synBackup()方法所在的线程,hasFinished已为true,它可以开始运行了[主要原因是:synBackup()方法调用了下边的waitForEndTask() 方法,而该方法是用wait()等待线程池所有线程运行结束的。]。

    2)isEndTask()方法的代码不能是while(true);改为:若没有完成,就wait(),放弃CPU,让CPU宝贵的资源留给线程池中的线程。因此方法名改为waitForEndTask()。代码如下:

    public void waitForEndTask() {

    synchronized(变量hasFinished所在的对象){

    while (hasFinished==false) {

    try{变量hasFinished所在的对象.wait();}

    catch(InterruptedException e){}

    }

    }

    3)这样设计的目的是:当线程池中线程没有全部运行结束时,synBackup()方法[内部调用了waitForEndTask() ]所有的线程是处于wait()下,不占用宝贵的CPU资源,让CPU资源全部留给了线程池中线程。当线程池中所有的线程全运行结束,才会通过notifyAll()来唤醒synBackup()方法所有的线程继续向下运行。

    importjava.io.*;importjava.util.concurrent.*;importjava.util.*;classMyThreadPoolExecutorextendsThreadPoolExecutor{privatebooleanhasFinish=false;publicMyThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime, TimeUnit unit, BlockingQueueworkQueue, RejectedExecutionHandler handler)

    {super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);//TODO Auto-generated constructor stub}publicMyThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

    {super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,

    threadFactory, handler);//TODO Auto-generated constructor stub}publicMyThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory) {super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,

    threadFactory);//TODO Auto-generated constructor stub}publicMyThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime, TimeUnit unit, BlockingQueueworkQueue) {super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);//TODO Auto-generated constructor stub}/*(non-Javadoc)

    * @see java.util.concurrent.ThreadPoolExecutor#afterExecute(java.lang.Runnable, java.lang.Throwable)*/@OverrideprotectedvoidafterExecute(Runnable r, Throwable t) {//TODO Auto-generated method stubsuper.afterExecute(r, t);synchronized(this){

    System.out.println("自动调用了....afterEx 此时getActiveCount()值:"+this.getActiveCount());if(this.getActiveCount()==1)//已执行完任务之后的最后一个线程{this.hasFinish=true;this.notify();

    }//if}//synchronized}publicvoidisEndTask() {synchronized(this){while(this.hasFinish==false) {

    System.out.println("等待线程池所有任务结束: wait...");try{this.wait();

    }catch(InterruptedException e) {//TODO Auto-generated catch blocke.printStackTrace();

    }

    }

    }

    }

    }

    展开全文
  • 场景:有类crawler,以及它的对象 _pService。crawler类中声明了两个boost thread成员变量: ...由外部线程在需要的时候调用_pService->fun()来启动这两个线程,并给成员变量workThrd、parse...
  • NtQuerySystemInformation判断线程是否被挂起/判断线程状态
  • 判断线程是否已经启动 问题 你已经启动了一个线程,但是你想知道它是不是真的已经开始运行了。 解决方案 线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的...
  • 如何判断线程运行结束

    千次阅读 2021-02-28 12:40:40
    1.join()如果是一个线程,可以使用此方法,多个不合适2.CountDownLatch此为并发计数器,每个线程结束后减一(countDown()),countDownLatch.await();//等待所有子线程执行完3.线程池ThreadPoolExecutor的shutdown与...
  • 判断线程运行状态的两种方法

    千次阅读 2016-07-29 16:42:53
    判断线程运行状态的两种方法 判断线程运行状态的方法有很多,如可以采用类似于对象计数器的方法等等,那么这里向你介绍两种判断线程运行状态的方法,希望对你有所帮助。 AD:51CTO 网+ 第十二期沙龙:大话数据之...
  • isAlive( ) 方法是用来判断线程是否启动的方法。它的返回值是布尔型,启动为true,没启动为false。下面的代码说明了isAlive的使用方法:public class demoisAlive extends Thread{ //创建线程类 public void run()...
  • 搜索热词下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家,也给大家做个参考。...}public void printMsg() {// 获得运行此代码的线程的引用Thread t = Thread.currentThread();Stri...
  • Qt:windows上判断进程是否在运行

    千次阅读 2021-01-19 11:37:03
    通过QProcess类执行cmd命令(tasklist),获取当前的进程列表,然后根据指定的进程名和返回的结果进行比对,从而判断进程是否在运行 进程名字获取: 打开任务管理器 -》 右键点击某个进程 -》 点击属性 -》 最后...
  • 易语言源码易语言判断多个线程运行结束源码.rar
  • JAVA中有3种方式可以终止正在运行线程线程正常退出,即run()方法执行完毕了②使用Thread类中的stop()方法强行终止线程。但stop()方法已经过期了,不推荐使用③使用中断机制interrupt()1.stop()方法stop()java...
  • C/C++判断某个程序是否在运行

    千次阅读 2020-05-27 23:45:03
    Windows判断进程是否在运行: bool ret = false; HANDLE info_handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //拍摄系统中所有进程的快照 if(info_handle == INVALID_HANDLE_VALUE) { printf(...
  • C#中如何判断线程当前所处的状态

    万次阅读 多人点赞 2014-11-20 16:53:59
    C#中,线程对象Thread使用ThreadState属性指示线程状态,它是带Flags特性的枚举类型对象,因此判断线程当前的状态必须用bitmask按位运算来达到判断目的,不能直接使用相等来判断。
  • Python多线程以及判断线程是否结束

    千次阅读 2022-04-27 11:39:19
    python,多线程,结束
  • 最主要的还是判断十个进程是否都已结束 问题补充: 但是执行完了我用isAlive属性来判断,进程还是处于Runable 满意回答 class ReadFileThread implements Runnable { 设置一个静态变量count public static int ...
  • isAlive()方法: 判断当前的线程是否处于活动状态。 活动状态是指线程已经启动且尚未终止,线程处于正在运行或准备开始运行的状态,就 认为线程是存活的。 package com.yqq.app12; /** * @Author yqq * @Date ...
  • pthread 使用笔记2 判断线程是否存在

    千次阅读 2016-12-20 11:03:45
    1.一种自己立标志的方法,建立一个子线程是否结束的标志位,子线程中结束的位置上把标志位置位,父线程通过判断标志位的值来判断线程是否已经退出,为了保证父线程处理的时间子线程已经退出完毕,父线程判断子...
  • 主要介绍了Java线程操作的常见方法,结合实例形式总结分析了java线程的创建、线程名称的获取、设置以及线程启动的判断等相关操作实现技巧,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 499,068
精华内容 199,627
关键字:

判断线程是否在运行