Java多线程执行时间(如何控制 java 线程池中任务的执行时间)

2024-09-05 07:20:06 :11

java多线程执行时间(如何控制 java 线程池中任务的执行时间)

其实java多线程执行时间的问题并不复杂,但是又很多的朋友都不太了解如何控制 java 线程池中任务的执行时间,因此呢,今天小编就来为大家分享java多线程执行时间的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

如何控制 java 线程池中任务的执行时间

以前在远标实习时做过:可以使用 ThreadPoolExedcutor 自定义线程池时,如何控制线程池中任务的执行时间?例如,当任务执行时间超过 1 分钟就取消该线程。(ps:除 Future 外)

java如何计算线程池中线程同步和异步运行时间

两个相减就是运行时间。启动线程之前,获取系统时间,做为开始时间,线程结束后,在线程最后再获取一次系统时间,这个时间减去刚刚上面的那个时间,就是运算时间,记录一个起始时间,记录一个结束时间,两个相减就是程序运行时间。

java 多线程如何让程序运行一定时间后停止

你说的应该不是sleep吧。呵呵,这么简单的话,就没必要在这里问了。我猜测呢,你是要在多线程计时任务Task线程里面有个while循环?那么你需要一个TimerTask 来控制这个线程,也就是计时线程。那么这个计时线程,有两种方法~ 第一种,比较不讲究的方法,也就是,对结果处理不好的方式,类似于过时方法的stop,就是把你的Task线程在TimerTask里面启动。TimerTask里面类似于while(true){ Task.start(); Date date = new Date(); while(true){ 计算时间差,如果时间差大于超时时间,则break }}而在Task线程中,需要加上一行代码this.setDeamon(true);将这个task任务设置成后台线程。因为是TimerTask启动的这个后台任务线程, 一旦超时,那么,这个后台线程Task将会被强制shutdown 。这种方式适用于不怎么严格的线程要求。还有一种呢,就是比较严格,对后台处理要求很高的那种。就是两个线程中需要有共享的变量,将结果,运行状态,都要共享,当TimerTask发现超时的时候,会判断Task线程的处理结果。以及运行状态,而做出相应的处理。你问的问题比较宽泛。所以,我只能大致的把思路给介绍一下。如果,能牵扯到实际的问题,那样就容易判断用那种方式的线程超时机制比较好了。呵呵最后,节日愉快~~

如何控制java线程池中任务的执行时间

ExecutorService executor = Executors.newFixedThreadPool(PROCESS);//根据CPU核心创建线程池for (int i = 0; i 《 v.size(); i++) {CDA_ThreadTask thread = new CDA_ThreadTask(r);executor.execute(thread);}该处是我做的项目一角,一般线程池都是要通过for循环调度实现了runable接口的类的构造器,其中r是一个线程任务,如果你要定时也很简单,直接调用system.currentTime方法,然后通过if条件进行操作,通过break进行中断

java 如何计算线程执行时间

线程是独立的,启动了,就不受控,你可以考虑下面的方式,虽然不优雅,不过能解决你的问题,而跟线程相关的,也只能这样来设计。(如果你觉得线程的不太优雅,你可以采用观察者的模式来加在一起,那代码就优雅多了,简单的问题,不建议搞得这么优雅,你觉得呢?)启动线程之前,获取系统时间,做为开始时间线程结束后,在线程的代码的最后再获取一次系统时间,这个时间减去刚刚上面的那个时间,就是运算时间海枫科技、海枫论坛

java多线程环境下如何计算执行一个任务消耗的时间

再开始执行任务记下系统当前的毫秒数,当任务结束的时候记下系统当前毫秒数,然后相减就可以了,建议你用 动态代理,这样统计的比较准确

JAVA多线程里的循环耗时

这里你要改变下思维方式。虽然物理上是两个独立事件(开枪和子弹飞),但是计算机在绘图的时候,启示是一帧帧画上去的。所有的事件都是由连续帧绘制出来的。因此,只需要一个线程就可以了:

public void run(){int t = 0;while(flag){int bullet_time = t % 600;// fireif (bullet_time == 0) {    // draw fire event}else {    // draw bullets    switch (bullet_time) {    case 100:        // draw bullet 1        break;  // draw bullet 2case 200:        break;// draw bullet 3case 300:        break;// draw bullet 4case 400:        break;// draw bullet 5case 500:        break;        }}t += 100;try{Thread.sleep(100);}catch(Exception e){e.printStackTrace();}}}

有哪位Java大神知怎样测量一个多线程环境的方法的执行时间吗不要说我神经,这是有迫切需求的,不信请看

将每个 Thread 新建之后赋值给一个引用,如 Thread t = new Thread(......);

然后调用 t.join(); 这个方法会等待当前线程执行完。就是下面这样:

long t1 = System.currentTimeMillis();Thread;for (int i = 0; i 《 20; i++) {threads = new Thread(new Runnable() {public void run() {try {System.out.println(VersionEffective.getInstance());} catch (Exception e) {e.printStackTrace();}}});threads.start();}for (int i = 0; i 《 20; i++) {threads.join();}long t2 = System.currentTimeMillis();System.out.println("耗时:" + (t2 - t1) + "毫秒");

至于双重检查为什么要加 volatile,是因为 volatile 关键字在 JDK5 之后,保证了被其修饰的变量的可见性(JDK5 之前的版本是不可以的)。Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比(如果与原始变量不一致则修改原始变量)。这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而volatile赋予了变量可见性——禁止编译器对成员变量进行优化,它修饰的成员变量在每次被线程访问时,都强迫从内存中重读该成员变量的值;而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存,这样在任何时刻两个不同线程总是看到某一成员变量的同一个值,这就是保证了可见性。

所以,假设你的 private static volatile VersionHighEffective  me=null; 没有 volatile 关键字(那么就是 private static VersionHighEffective  me=null;),假设线程 t1 已经 new 了一个 VersionHighEffective 实例,但是这个实例目前可能只是保存在 t1 的“范围”里,还没有被写到主存;此时线程 t2 去执行这段代码:

if(me==null){     synchronized (VersionHighEffective.class) {       if (me == null) {         Thread.sleep(500);         me = new VersionHighEffective();       }     }   }

很明显 t2 从主存那访问到的 me 仍然是 null,所以最后 t2 又去 new 了一个 VersionHighEffective,这样就不是单例了。所以,加上 volatile 修饰,每次的修改后的变量都会强迫立即写到主存,那么前面的问题就不存在了。

关于java多线程执行时间到此分享完毕,希望能帮助到您。

java多线程执行时间(如何控制 java 线程池中任务的执行时间)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.