有关 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!");
}
}
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test{
private static final BlockingQueue queue=new LinkedBlockingQueue();
private static final ExecutorService threadpool=new ThreadPoolExecutor(10,20,0L,TimeUnit.MILLISECONDS,queue);
public static Future submit(final String name,final Object obj){
return threadpool.submit(new Callable(){
@Override
public Object call() throws Exception{
// TODO do your job here!
boolean lock=Token.tryLock(name);
if(!lock) return null;
try{
System.out.println(obj);
Thread.sleep(2000);
return obj;
}finally{
Token.unlock(name);
}
}
});
}
public static void main(String...args) throws Exception{
submit("t1","You got t1!");
submit("t1","You got t1!");
submit("t1","You got t1!");
submit("t2","You got t2!");
submit("t2","You got t2!");
submit("t2","You got t2!");
Thread.sleep(3000);
submit("t1","You got t1!");
submit("t1","You got t1!");
submit("t1","You got t1!");
submit("t2","You got t2!");
submit("t2","You got t2!");
submit("t2","You got t2!");
}
public static class Token{
private static final Lock lockme=new ReentrantLock();
private static final Map<String,Lock> locks=new HashMap<String,Lock>();
public static boolean tryLock(String name){
Lock lock=getLock(name);
return lock.tryLock();
}
public static void unlock(String name){
Lock lock=getLock(name);
lock.unlock();
}
private static Lock getLock(String name){
lockme.lock();
try{
Lock lock=locks.get(name);
if(lock==null){
lock=new ReentrantLock();
locks.put(name,lock);
}
return lock;
}finally{
lockme.unlock();
}
}
}
}