从这一篇开始我们将看看Java 5之后给我们添加的新的对线程操作的API,首先看看api文档:
java.util.concurrent包含许多线程安全、测试良好、高性能的并发构建块,我们先看看atomic包下的AtomicInteger.
import java.util.concurrent.atomic.AtomicInteger; public class AtomicIntegerTest { private static AtomicInteger data = new AtomicInteger(0); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { data.incrementAndGet(); //加 } }).start(); new Thread(new Runnable() { @Override public void run() { data.decrementAndGet(); //减 } }).start(); } }使用AtomicInteger可以很方便的实现线程之间的数据共享,如果某个成员变量要被多个线程操作则可以使用AtomicInteger来处理,其他数据类型也有对应的Atomic.
下面我们再来看一下线程并发池的使用,在java.util.concurrent包下有关于线程并发池的相关工具类。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ThreadPoolTest { public static void main(String[] args) { //创建3个线程执行任务 ExecutorService threadPool = Executors.newFixedThreadPool(3); //ExecutorService threadPool = Executors.newCachedThreadPool(); //动态添加线程 //创建单个线程(线程死后会重新启动) //ExecutorService threadPool = Executors.newSingleThreadExecutor(); //池子中添加10个任务 for(int i=1; i<=10; i++){ final int task = i; threadPool.execute(new Runnable() { @Override public void run() { //每个任务是输出1到10 for(int j=1; j<=10; j++){ try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " loop of " + j + " for task " + task); } } }); } System.out.println("10 task has commited"); threadPool.shutdown(); //线程池执行完后结束线程 //threadPool.shutdownNow(); 立即结束线程 //线程池启动定时器 Executors.newScheduledThreadPool(3).schedule(new Runnable() { @Override public void run() { System.out.println("bombing!"); } }, 10, TimeUnit.SECONDS); /*Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("bombing!"); } }, 10, 3, TimeUnit.SECONDS);*/ } }创建线程池的方式有三种:
1、newFixedThreadPool(n) :创建n个线程
2、newCachedThreadPool() :动态添加线程(依据任务池中的任务数量动态创建线程)
3、newSingleThreadPool() :创建单一线程(线程死后会重新创建)
上面代码中创建了3个线程并分配了10个任务,3个线程会先执行任务池中的3个任务,当某个线程任务执行完后会从任务池中取没有被执行的任务继续执行,直到任务池中的所有任务执行完成后,线程会处于等待状态,最后使用shutdown()方法结束线程。