zoukankan      html  css  js  c++  java
  • Android多线程研究(7)——Java5中的线程并发库

    从这一篇开始我们将看看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()方法结束线程。




  • 相关阅读:
    java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor错误
    http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html
    异或巧用:Single Number
    Highcharts:X轴分组堆叠图
    Vs2012在Linux开发中的应用(5):项目属性的定义
    BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度
    Python 点滴 I
    easyUI 验证控件应用、自己定义、扩展验证 手机号码或电话话码格式
    InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts
    Java设计模式-设计模式的六种原则
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468925.html
Copyright © 2011-2022 走看看