精华内容
下载资源
问答
  • 请教大虾们,我要在java监控应用程序中的线程是否在运行,请问该如何去做?谢谢各位不吝赐教。
  • 如何监控线程的状态?(How to monitor a thread's status?)问题描述 (Problem Description)如何监控线程的状态?解决方案 (Solution)下面的示例演示如何通过扩展Thread类和使用currentThread.getName()方法来监视...

    如何监控线程的状态?(How to monitor a thread's status?)

    问题描述 (Problem Description)

    如何监控线程的状态?

    解决方案 (Solution)

    下面的示例演示如何通过扩展Thread类和使用currentThread.getName()方法来监视线程的状态。class MyThread extends Thread {

    boolean waiting = true;

    boolean ready = false;

    MyThread() {

    }

    public void run() {

    String thrdName = Thread.currentThread().getName();

    System.out.println(thrdName + " starting.");

    while(waiting) System.out.println("waiting:"+waiting);

    System.out.println("waiting...");

    startWait();

    try {

    Thread.sleep(1000);

    } catch(Exception exc) {

    System.out.println(thrdName + " interrupted.");

    }

    System.out.println(thrdName + " terminating.");

    }

    synchronized void startWait() {

    try {

    while(!ready) wait();

    } catch(InterruptedException exc) {

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

    }

    }

    synchronized void notice() {

    ready = true;

    notify();

    }

    }

    public class new_class {

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

    MyThread thrd = new MyThread();

    thrd.setName("MyThread #1");

    showThreadStatus(thrd);

    thrd.start();

    Thread.sleep(50);

    showThreadStatus(thrd);

    thrd.waiting = false;

    Thread.sleep(50);

    showThreadStatus(thrd);

    thrd.notice();

    Thread.sleep(50);

    showThreadStatus(thrd);

    while(thrd.isAlive())

    System.out.println("alive");

    showThreadStatus(thrd);

    }

    static void showThreadStatus(Thread thrd) {

    System.out.println(thrd.getName()+" Alive:="+thrd.isAlive()+" State:=" + thrd.getState() );

    }

    }

    结果 (Result)

    上面的代码示例将产生以下结果。main Alive=true State:=running

    展开全文
  • 那么如何判断所有线程(事情)都做完了呢?这就需要判断所有当前运行的线程状态了。import java.util.concurrent.CountDownLatch;import java.util.concurrent.Executor;import java.util.concurrent.Executors;/*** ...

    场景:需要启动多线程处理事情,而在所有事情做完之后,需要修改系统状态;那么如何判断所有线程(事情)都做完了呢?这就需要判断所有当前运行的线程状态了。

    import java.util.concurrent.CountDownLatch;

    import java.util.concurrent.Executor;

    import java.util.concurrent.Executors;

    /**

    * 测试监控类

    *

    * @author

    *

    */

    public class WatchThread {

    /**

    * 测试函数

    *

    * @throws InterruptedException

    */

    public void testThread() throws InterruptedException {

    int threadNum = 10;

    // 初始化countDown

    CountDownLatch threadSignal = new CountDownLatch(threadNum);

    // 创建固定长度的线程池

    Executor executor = Executors.newFixedThreadPool(threadNum);

    for (int i = 0; i < threadNum; i++) { // 开threadNum个线程

    Runnable task = new TestThread(threadSignal);

    // 执行

    executor.execute(task);

    }

    threadSignal.await(); // 等待所有子线程执行完

    // do work

    System.out.println(Thread.currentThread().getName() + "+++++++结束.");

    }

    /**

    * 测试函数

    */

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

    WatchThread test = new WatchThread();

    test.testThread();

    }

    /**

    *

    * @author jill

    *

    */

    private class TestThread implements Runnable {

    private CountDownLatch threadsSignal;

    public TestThread(CountDownLatch threadsSignal) {

    this.threadsSignal = threadsSignal;

    }

    public void run() {

    System.out.println(Thread.currentThread().getName() + "开始...");

    // do shomething

    System.out.println("开始了线程::::" + threadsSignal.getCount());

    // 线程结束时计数器减1

    threadsSignal.countDown();

    System.out.println(Thread.currentThread().getName() + "结束. 还有"

    + threadsSignal.getCount() + " 个线程");

    }

    }

    }

    展开全文
  • 之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。但在实际开发过程中,在线程池使用过程中...

    之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。

    但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等。

    如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。

    总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数。

    下面给出一个线程池使用示例,及教你获取线程池状态。

    private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS,

    new LinkedBlockingQueue(100000));

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

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

    es.execute(() -> {

    System.out.print(1);

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    });

    }

    ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es);

    while (true) {

    System.out.println();

    int queueSize = tpe.getQueue().size();

    System.out.println("当前排队线程数:" + queueSize);

    int activeCount = tpe.getActiveCount();

    System.out.println("当前活动线程数:" + activeCount);

    long completedTaskCount = tpe.getCompletedTaskCount();

    System.out.println("执行完成线程数:" + completedTaskCount);

    long taskCount = tpe.getTaskCount();

    System.out.println("总线程数:" + taskCount);

    Thread.sleep(3000);

    }

    }

    线程池提交了 100000 个任务,但同时只有 50 个线程在执行工作,我们每陋 3 秒来获取当前线程池的运行状态。

    第一次程序输出:

    当前排队线程数:99950

    当前活动线程数:50

    执行完成线程数:0

    总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

    第二次程序输出:

    当前排队线程数:99800

    当前活动线程数:50

    执行完成线程数:150

    总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

    活动线程数和总线程数是不变的,排队中的线程数和执行完成的线程数不断在变化,直到所有任务执行完毕,最后输出:

    当前排队线程数:0

    当前活动线程数:0

    执行完成线程数:100000

    总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

    这样,你了解了这些 API 的使用方法,你想监控线程池的状态就非常方便了。

    展开全文
  • 之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。但在实际开发过程中,在线程池使用过程中...

    之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。

    但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等。

    如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。

    总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数。

    下面给出一个线程池使用示例,及教你获取线程池状态。

    private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS,

    new LinkedBlockingQueue(100000));

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

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

    es.execute(() -> {

    System.out.print(1);

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    });

    }

    ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es);

    while (true) {

    System.out.println();

    int queueSize = tpe.getQueue().size();

    System.out.println("当前排队线程数:" + queueSize);

    int activeCount = tpe.getActiveCount();

    System.out.println("当前活动线程数:" + activeCount);

    long completedTaskCount = tpe.getCompletedTaskCount();

    System.out.println("执行完成线程数:" + completedTaskCount);

    long taskCount = tpe.getTaskCount();

    System.out.println("总线程数:" + taskCount);

    Thread.sleep(3000);

    }

    }

    线程池提交了 100000 个任务,但同时只有 50 个线程在执行工作,我们每陋 3 秒来获取当前线程池的运行状态。

    第一次程序输出:

    当前排队线程数:99950

    当前活动线程数:50

    执行完成线程数:0

    总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

    第二次程序输出:

    当前排队线程数:99800

    当前活动线程数:50

    执行完成线程数:150

    总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

    活动线程数和总线程数是不变的,排队中的线程数和执行完成的线程数不断在变化,直到所有任务执行完毕,最后输出:

    当前排队线程数:0

    当前活动线程数:0

    执行完成线程数:100000

    总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

    这样,你了解了这些 API 的使用方法,你想监控线程池的状态就非常方便了。

    扫描关注我们的微信公众号,干货每天更新。

    展开全文
  • setMaximumPoolSize 是否动态有效看下jdk源码不就知道了/*** Sets the maximum allowed number of threads. This overrides any* value set in the constructor. If the new value is smaller than* the current ...
  • package org.corey....import java.awt.HeadlessException;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import...
  • 之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。但在实际开发过程中,在线程池使用过程中...
  • 之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。但在实际开发过程中,在线程池使用过程中...
  • 之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。但在实际开发过程中,在线程池使用过程中...
  • 错误的线程中止 - stop首先来讲解一个错误的方式来终止线程 — stop:中止线程,并且清除监控器锁的信息,但是可能导致线程安全问题,JDK 不建议使用,类似的方法还有 destory,由于 JDK 从未实现该方法,在这里就不...
  • import java.util.concurrent.CountDownLatch;import java.util.concurrent.Executor;import java.util..../*** 测试监控类** @author**/public class WatchThread {/*** 测试函数** @throws InterruptedEx...
  • 如何Java监控某个文件目录? 比如,目录中文件的新增,修改,删除。并能通过日志输出此文件目录的状态信息等。 初步想了下: 对于文件的新增和删除,可以通过线程每隔一段时间去扫描目录,根据文件个数来...
  • 中止线程,并且清楚监控锁的信息,但是可能导致线程安全问题,JDK不建议用。 ② Destroy JDK从未实现该方法。 ③ 通过代码示例说明 Demo3.java public class Demo3 { public static void main(String[] ...
  • Java实现监控多个线程状态的实现

    千次阅读 2016-11-26 17:18:16
    场景:需要启动多线程处理事情,而在所有事情做完之后,需要...那么如何判断所有线程(事情)都做完了呢?这就需要判断所有当前运行的线程状态了。   import java.util.concurrent.CountDownLatch; import java.util.
  • 上次说了线程的6种状态,这次说说如何中止一个正在运行的线程。(一)不正确的线程终止 - Stop① stop中止线程,并且清楚监控锁的信息,但是可能导致线程安全问题,JDK不建议用。② DestroyJDK从未实现该方法。③ 通过...
  • Linux系统监控命令及定位Java线程 1.PID.TID的区分 uid是user id,即用户id,root用户的uid是0,0为最高权限,gid是group id,用户组id,使用 id 命令可以很简单的通过用户名查看UID.GID:~ ... 总结:常用的Linux系统监控...
  • 监控线程如何重启?

    2010-06-10 09:54:24
    我打算做一个机制来监控这个监听线程是否已经死掉,我想问问各位老师这个机制该怎么去实现,如何实现重启这个线程?或者说我这种应用场景有没有一个简单一点的开源框架满足我的要求 [code="java"] public class ...
  • Java线程--线程监控工具之Jconsole

    千次阅读 2017-09-07 14:22:57
    一、JConsole是什么  从Java 5开始 引入了 ...您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。 二、如何启动JConsole 如果是从命令行启动,使
  • Java并发编程:多线程如何实现阻塞与唤醒说到suspend与resume组合有死锁倾向,一不小心将导致很多问题,甚至导致整个系统崩溃。接着看另外一种解决方案,我们可以使用以对象为目标的阻塞,即利用Object类的wait()和...
  • 在实际编程时,如果有一些定时运行的统计类、监控类的线程,这些线程最好设置为守护线程如何创建一个定时执行的守护线程线程池当所有用户线程退出后,守护线程即便没有运行完,也将终止public class Test {public ...
  • 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控 (1)线程池中submit()和exectute()方法的区别? execute():只能...
  • Tcpdump 是一个简单、可靠的网络监控工具,用来做基本的协议分析,看看那些进程在使用网络以及如何使用网络。 如果需要获取详细的信息,可以使用 Wireshark 。 >>Linux监控常用的操作 netstat -natp : 查看对应的...
  • 那么如何判断所有线程(事情)都做完了呢?这就需要判断所有当前运行的线程状态了。 代码 importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.Executor;importjava.util.concurrent....
  • 如何定位cpu占用率高的java线程工具:1jstack:jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种...

空空如也

空空如也

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

java如何监控线程

java 订阅