多线程中几个特殊的类

1、FutureTask

 1 package com.ietree.basicskill.mutilthread.OtherClass;
 2
 3 import java.util.concurrent.*;
 4
 5 /**
 6  * Created by Administrator on 2017/5/17.
 7  */
 8 public class UseFuture implements Callable<String> {
 9
10     private String para;
11
12     public UseFuture(String para){
13         this.para = para;
14     }
15
16     /**
17      * 这里是真实的业务逻辑,其执行可能很慢
18      */
19     @Override
20     public String call() throws Exception {
21         //模拟执行耗时
22         Thread.sleep(5000);
23         String result = this.para + "处理完成";
24         return result;
25     }
26
27     //主控制函数
28     public static void main(String[] args) throws Exception {
29         String queryStr = "query";
30         //构造FutureTask,并且传入需要真正进行业务逻辑处理的类,该类一定是实现了Callable接口的类
31         FutureTask<String> future = new FutureTask<String>(new UseFuture(queryStr));
32
33         FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr));
34         //创建一个固定线程的线程池且线程数为1,
35         ExecutorService executor = Executors.newFixedThreadPool(2);
36         //这里提交任务future,则开启线程执行RealData的call()方法执行
37         //submit和execute的区别: 第一点是submit可以传入实现Callable接口的实例对象, 第二点是submit方法有返回值
38
39         Future f1 = executor.submit(future);        //单独启动一个线程去执行的
40         Future f2 = executor.submit(future2);
41         System.out.println("请求完毕");
42
43         try {
44             //这里可以做额外的数据操作,也就是主程序执行其他业务逻辑
45             System.out.println("处理实际的业务逻辑...");
46             Thread.sleep(1000);
47         } catch (Exception e) {
48             e.printStackTrace();
49         }
50         //调用获取数据方法,如果call()方法没有执行完成,则依然会进行等待
51         System.out.println("数据:" + future.get());
52         System.out.println("数据:" + future2.get());
53
54         executor.shutdown();
55     }
56
57
58 }

2、CyclicBarrier

 1 package com.ietree.basicskill.mutilthread.OtherClass;
 2
 3 import java.io.IOException;
 4 import java.util.Random;
 5 import java.util.concurrent.BrokenBarrierException;
 6 import java.util.concurrent.CyclicBarrier;
 7 import java.util.concurrent.ExecutorService;
 8 import java.util.concurrent.Executors;
 9
10 /**
11  * Created by Administrator on 2017/5/17.
12  */
13 public class UseCyclicBarrier {
14
15     static class Runner implements Runnable {
16         private CyclicBarrier barrier;
17         private String name;
18
19         public Runner(CyclicBarrier barrier, String name) {
20             this.barrier = barrier;
21             this.name = name;
22         }
23         @Override
24         public void run() {
25             try {
26                 Thread.sleep(1000 * (new Random()).nextInt(5));
27                 System.out.println(name + " 准备OK.");
28                 barrier.await();
29             } catch (InterruptedException e) {
30                 e.printStackTrace();
31             } catch (BrokenBarrierException e) {
32                 e.printStackTrace();
33             }
34             System.out.println(name + " Go!!");
35         }
36     }
37
38     public static void main(String[] args) throws IOException, InterruptedException {
39         CyclicBarrier barrier = new CyclicBarrier(3);  // 3
40         ExecutorService executor = Executors.newFixedThreadPool(3);
41
42         executor.submit(new Thread(new Runner(barrier, "zhangsan")));
43         executor.submit(new Thread(new Runner(barrier, "lisi")));
44         executor.submit(new Thread(new Runner(barrier, "wangwu")));
45
46         executor.shutdown();
47     }
48
49 }

3、CountDownLatch

 1 package com.ietree.basicskill.mutilthread.OtherClass;
 2
 3 import java.util.concurrent.CountDownLatch;
 4
 5 /**
 6  * Created by Administrator on 2017/5/17.
 7  */
 8 public class UseCountDownLatch {
 9
10     public static void main(String[] args) {
11
12         final CountDownLatch countDown = new CountDownLatch(2);
13
14         Thread t1 = new Thread(new Runnable() {
15             @Override
16             public void run() {
17                 try {
18                     System.out.println("进入线程t1" + "等待其他线程处理完成...");
19                     countDown.await();
20                     System.out.println("t1线程继续执行...");
21                 } catch (InterruptedException e) {
22                     e.printStackTrace();
23                 }
24             }
25         },"t1");
26
27         Thread t2 = new Thread(new Runnable() {
28             @Override
29             public void run() {
30                 try {
31                     System.out.println("t2线程进行初始化操作...");
32                     Thread.sleep(3000);
33                     System.out.println("t2线程初始化完毕,通知t1线程继续...");
34                     countDown.countDown();
35                 } catch (InterruptedException e) {
36                     e.printStackTrace();
37                 }
38             }
39         });
40         Thread t3 = new Thread(new Runnable() {
41             @Override
42             public void run() {
43                 try {
44                     System.out.println("t3线程进行初始化操作...");
45                     Thread.sleep(4000);
46                     System.out.println("t3线程初始化完毕,通知t1线程继续...");
47                     countDown.countDown();
48                 } catch (InterruptedException e) {
49                     e.printStackTrace();
50                 }
51             }
52         });
53
54         t1.start();
55         t2.start();
56         t3.start();
57     }
58 }

4、Semaphore

 1 package com.ietree.basicskill.mutilthread.OtherClass;
 2
 3 import java.util.concurrent.ExecutorService;
 4 import java.util.concurrent.Executors;
 5 import java.util.concurrent.Semaphore;
 6
 7 /**
 8  * Created by Administrator on 2017/5/17.
 9  */
10 public class UseSemaphore {
11
12     public static void main(String[] args) {
13         // 线程池
14         ExecutorService exec = Executors.newCachedThreadPool();
15         // 只能5个线程同时访问
16         final Semaphore semp = new Semaphore(5);
17         // 模拟20个客户端访问
18         for (int index = 0; index < 20; index++) {
19             final int NO = index;
20             Runnable run = new Runnable() {
21                 public void run() {
22                     try {
23                         // 获取许可
24                         semp.acquire();
25                         System.out.println("Accessing: " + NO);
26                         //模拟实际业务逻辑
27                         Thread.sleep((long) (Math.random() * 10000));
28                         // 访问完后,释放
29                         semp.release();
30                     } catch (InterruptedException e) {
31                     }
32                 }
33             };
34             exec.execute(run);
35         }
36
37         try {
38             Thread.sleep(10);
39         } catch (InterruptedException e) {
40             e.printStackTrace();
41         }
42         //System.out.println(semp.getQueueLength());
43         // 退出线程池
44         exec.shutdown();
45     }
46 }
时间: 2024-08-07 17:22:27

多线程中几个特殊的类的相关文章

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过start方法启动线程--->线程变为可运行可执行状态,然后通过数据产生共享,线程产生互斥---->线程状态变为阻塞状态---->阻塞状态想打开的话可以调用notify方法. 这里Java5中提供了封装好的类,可以直接调用然后构造阻塞状态,以保证数据的原子性. 2.如何实现? 主要是实现Blo

python多线程中锁的概念

python的锁可以独立提取出来 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([timeout]) #释放 mutex.release() 概念 好几个人问我给资源加锁是怎么回事,其实并不是给资源加锁, 而是用锁去锁定资源,你可以定义多个锁, 像下面的代码, 当你需要独占某一资源时,任何一个锁都可以锁这个资源 就好比你用不同的锁都可以把相同的一个门锁住是一个道理 import thr

C#多线程开发7:使用Monitor类同步多个线程

在<使用lock语句同步多个线程>的文章中,使用lock语句同步多线程访问临界资源. 使用lock语句的代码如下所示. private static object o = new object(); lock (o) { if (account >= 1000) { Thread.Sleep(10);//自动取款机打了个小盹 account -= 1000; pocket += 1000; } } 使用ILDASM工具查看上面代码对应的IL代码: 可以发现:lock语句被解析为调用Mon

多线程 中 对多次初始化问题解决方案

今天在看MSDN 库源代码时发现了一个类 LazyInitializer.EnsureInitialized 并行计算时用到的. MSdn代码 // Used to hold any exceptions encountered during action processing ConcurrentQueue<Exception> exceptionQ = null; // will be lazily initialized if necessary // This is more effi

重温java中的String,StringBuffer,StringBuilder类

任何一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBuilder 长度是可变的; 3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的. String 类已在上一篇随笔 小瓜牛

如何在多线程中使用JNI?

如果你想了解JNI在如何在多线程下使用 如果你在子线程使用JNI时遇到findClass不能找到目标Class,而在主线程下却能找到该Class的问题.或是GetEnv返回NULL的问题 如果你想多学点编程技术的话 那么,这篇文章就是为你而写的, :) 最近工作中遇到这么个问题:c++代码需要调用Android的API来做一个比较耗时的任务,因为有点耗时,希望能有个进度条显示给用户,很自然地,我创建了一个子线程用来执行这个耗时的任务,按照平时写法,结果一运行,GetEnv获取失败了.网上查找一番

多线程中的信号机制--signwait()函数【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14237277 在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同.在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号.它完全是异步的(我们完全不知到信号会在进程的那个执行点到来!).然而信号处理函数的实现,有着许多的限制:比如有一些函数不能在信号处理函数中调用:再比如一些函数read.recv等调用时会被异

Java多线程中线程间的通信

一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.util.List; public class MyList { private volatile static List list = new ArrayList(); public void add() { list.add("apple"); } public int size() {