日期:2014-05-19  浏览次数:20689 次

有关 java中 线程的问题!高手进
目前系统中有一个需求需要用到线程,
点击一个按钮,启动一个线程,处理相关业务(这个线程大概10个小时后结束),
当这个线程还没结束时,又点击这个按钮,又会启动一个线程,这样就重复了。

当再次点击这个按钮时,如何判断前面那个线程是否已结束?
 

------解决方案--------------------
使用线程锁,或者设置标记都行。
------解决方案--------------------
Thread.activeCount()
判断当前java进程线程数
------解决方案--------------------
正如前面的哥们所诉,可以设计标记,thread中有很多方法来检测是执行过,如:isAlive() ,getState() ,都可以取得线程状态,最好使用锁机制。over

------解决方案--------------------
单例线程,线程中有状态属性。获得线程后,检查线程状态
------解决方案--------------------
JDK6实现方案,还是代码实在,分全给我,谢谢!

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test{
  private static final BlockingQueue queue=new SynchronousQueue();
  //  private static final BlockingQueue queue=new LinkedBlockingQueue(1);
  private static final ExecutorService threadpool=new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,queue);

  public static Future submit(final Object obj){
    return threadpool.submit(new Callable(){
      @Override
      public Object call() throws Exception{
        // TODO do your job here!
        System.out.println(obj);
        Thread.sleep(2000);
        return obj;
      }
    });
  }

  public static void main(String...args) throws Exception{
    submit("You got it!");
    submit("You got it!");
    submit("You got it!");
  }
}

我给的代码默认只有一个任务在工作,之前的未完成自动会抛出异常,自己根据需要进行处理;注释掉的那行意思是允许有一个在等待,总体来说就是倒腾那个queue
SynchronousQueue:0等待,必须先有取等待才允许提交任务;
LinkedBlockingQueue:可以根据需要配置等待任务数。
------解决方案--------------------
zoeg  给出的思路是对的。用java的线程池,配合自带的队列,并设置队列是阻塞的,线程池回按队列中的线程顺序去执行,阻塞意味着第一个执行之后才会执行第2个
------解决方案--------------------
这个很简单啊,直接用标志位不就行了
------解决方案--------------------
引用:
引用:我给的代码默认只有一个任务在工作,之前的未完成自动会抛出异常,自己根据需要进行处理;注释掉的那行意思是允许有一个在等待,总体来说就是倒腾那个queue
SynchronousQueue:0等待,必须先有取等待才允许提交任务;
LinkedBlockingQueue:可以根据需要配置等待任务数。 

不行啊  整个WEB应用 一到晚上……


其他的线程你不用关心啊。

给这快功能 , 就单独用个线程池 , 其他的线程不要放到这个线程池里面。
------解决方案--------------------
我去,赚点分不容易啊,有话你就不能一次性说完。。。
我就不解释了,自己看代码:

import java.util.HashMap;
import java.util.Map;