java.util.concurrent 之一
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool {
public static void main(String args[]) throws InterruptedException{
// only two threads
ExecutorService exec = Executors.newFixedThreadPool(2);
for(int index=0; index < 10; index++){
Runnable run = new Runnable(){
public void run(){
long time = (long)(Math.random() * 1000);
System.out.println("Sleeping " + time + "ms");
try{
Thread.sleep(time);
} catch(InterruptedException e){
}
}
};
exec.execute(run);
} // must shutdown
exec.shutdown();
}
}
可能的运行结果:
Sleeping 543ms
Sleeping 33ms
Sleeping 658ms
Sleeping 740ms
Sleeping 145ms
Sleeping 216ms
Sleeping 890ms
Sleeping 864ms
Sleeping 786ms
Sleeping 644ms
上面是一个简单的例子。使用大小为2的线程池来处理10个线程。
它使用了Executors的静态函数 newFixedThreadPool() 生成一个固定的线程池。顾名思义,
线程池是不会释放的,即使它是Idle。这就会产生性能问题。比如如果线程池的大小为200,当全部使用完毕后,
所有的线程会继续留在池中,相应的内存和线程切换(while(true)+sleep)都会增加。如果要避免这个问题,就
必须直接使用ThreadPoolExecutor()来构造。可以像Tomcat的线程池一样,设置“最大线程数”、“最小线程数”
和“空闲线程keepAlive的时间”。通过这些可以基本上替换Tomcat的线程池实现方案。
需要注意的是线程池必须使用shutdown来显式关闭,否则主线程就无法退出。
分享到:
相关推荐
- 探索Java并发包(java.util.concurrent),理解线程池、并发工具类如Semaphore、CountDownLatch等。 - 熟悉JDBC API,包括Connection、Statement、PreparedStatement、ResultSet等对象的使用。 5. **实战项目与...
在`Producer`和`Consumer`线程的交互过程中,可能还会用到阻塞队列(如`java.util.concurrent`包中的`BlockingQueue`接口)等高级并发工具,它们内置了线程同步机制,可以简化代码并提高性能。 总结来说,这个...
3. 使用`ReentrantLock`:如果需要更细粒度的锁控制,可以使用`java.util.concurrent.locks.ReentrantLock`,它提供了公平锁和非公平锁的选择,以及可中断和定时等待的特性。 4. 使用`ConcurrentHashMap`:在并发...
可以使用`java.util.concurrent.ExecutorService`、`java.util.concurrent.Future`,或者`android.os.AsyncTask`来实现异步上传。现在更推荐使用`java.util.concurrent`包下的工具,因为`AsyncTask`已被标记为废弃。...
在Java中,`java.util.concurrent`包提供了`ExecutorService`接口和相关的实现,如`ThreadPoolExecutor`,它是线程池的核心。`ExecutorService`接口定义了添加任务、启动线程池、关闭线程池等方法。`...
Java提供了丰富的并发工具类,如ExecutorService、Semaphore、CyclicBarrier等,以及synchronized关键字和java.util.concurrent包下的原子类,帮助开发者编写高效的多线程程序。 9. **反射**: 反射允许程序在...
import java.util.concurrent.Future; public class GetResultFromMatlab { public static void main(String[] args) { try { MatlabEngine matlab = MatlabEngine.startMatlab(); // 在 Matlab 中计算 ...
1. 使用`java.util.concurrent`包下的ExecutorService和Future接口,创建线程池并提交任务。 2. 在工作线程中使用`synchronized`关键字进行同步,确保对共享资源的访问是线程安全的。 3. 使用`volatile`关键字标记...
- 使用`java.util.concurrent`包中的`BlockingQueue`接口,如`ArrayBlockingQueue`,它内置了线程安全的队列操作。 - 生产者使用`put()`方法将数据放入队列,若队列已满,会自动阻塞。 - 消费者使用`take()`方法...