• 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()方法结束线程。




  • 相关阅读:
    用POP动画模拟真实秒钟摆动效果
    解析苹果的官方例子LazyTableImages实现图片懒加载原理
    支持xcode6的缓动函数Easing以及使用示例
    [转] iOS 动画库 Pop 和 Canvas 各自的优势和劣势是什么?
    NSJSONSerialization能够处理的JSONData
    [翻译] USING GIT IN XCODE [6] 在XCODE中使用GIT[6]
    [翻译] USING GIT IN XCODE [5] 在XCODE中使用GIT[5]
    [翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]
    [翻译] USING GIT IN XCODE [3] 在XCODE中使用GIT[3]
    【转】断点继传
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468925.html
Copyright © 2020-2023  润新知