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




  • 相关阅读:
    Heidisql导入导出SQL脚本
    递归遍历删除children为[]的children
    将v-model的值绑定到vuex中时遇到的问题及解决办法(computed替代watch)
    为什么不建议v-for和v-if一起使用
    vue全选和取消全选的实现方式(主要是理解computed中的set和get)
    全部设置为仅查看/可编辑【第三种方法:computed】
    全部设置为仅查看/可编辑【第二种方法:watch+methods】
    全部设置为仅查看/可编辑【第一种方法:watch】
    v-model的三个修饰符
    在表单元素上使用v-model的注意事项
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468925.html
Copyright © 2011-2022 走看看