join模拟订单

package com.future.demo.future;

/**
*
*
* @author Administrator
*
*/
public class NormalThreadTest { public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
// 开启购买厨具线程
ShoppingThread shopping = new ShoppingThread();
shopping.start();
shopping.join(); // 保障厨具购买并送货
// 获取到购买厨具
KitchenWare kc = shopping.kc; // 买食材
FoodMaterial fm = new FoodMaterial();
Thread.sleep(2000);
System.out.println("第二步: 食材已经到位");
// 烹饪美食
cooking(kc, fm);
System.out.println("第三步: 美食烹饪完成");
long end = System.currentTimeMillis();
System.out.println("烹饪美食时间为:" + (end - start));
} /**
* 定义网上购物厨具线程
* @author Administrator
*
*/
static class ShoppingThread extends Thread { // 厨具对象引用
private KitchenWare kc; @Override
public void run() {
System.out.println("第一步: 网上下单");
System.out.println("第一步: 等待厨具");
try {
Thread.sleep(5000); // 等待厨具时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第一步: 快递送货");
// 生产厨具
kc = new KitchenWare();
}
} /**
* 厨具类
* @author Administrator
*
*/
static class KitchenWare { } /**
* 食材类
* @author Administrator
*
*/
static class FoodMaterial { } /**
* 定义烹饪食物的方法
* @param kc
* @param fm
*/
static void cooking(KitchenWare kc, FoodMaterial fm) { }
}
异步进行
package com.future.demo.future;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; /**
* 异步: 同时进行
* 同步: 排队进行
* @author Administrator
*
*/
public class FutureThreadTest { public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis(); Callable<KitchenWare> callable = new Callable<KitchenWare>() {
public KitchenWare call() throws Exception {
System.out.println("第一步: 网上下单");
System.out.println("第一步: 等待厨具");
try {
Thread.sleep(5000); // 等待厨具时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第一步: 快递送货");
return new KitchenWare();
} };
// 包装为异步执行的对象
FutureTask<KitchenWare> task = new FutureTask<>(callable);
new Thread(task).start(); // 买食材
FoodMaterial fm = new FoodMaterial();
Thread.sleep(2000);
System.out.println("第二步: 食材已经到位"); if (!task.isDone()) {
System.out.println("厨具还没有到.....");
}
// 通过阻塞形式获取到异步块执行的结果
KitchenWare kc = task.get(); // 阻塞
// 烹饪美食
cooking(kc, fm);
System.out.println("第三步: 美食烹饪完成");
long end = System.currentTimeMillis();
System.out.println("烹饪美食时间为:" + (end - start));
} /**
* 厨具类
* @author Administrator
*
*/
static class KitchenWare { } /**
* 食材类
* @author Administrator
*
*/
static class FoodMaterial { } /**
* 定义烹饪食物的方法
* @param kc
* @param fm
*/
static void cooking(KitchenWare kc, FoodMaterial fm) { }
}

线程池

ThreadPoolExecutor
package com.future.demo.threadPool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* ThreadPoolExecutor
* int corePoolSize 线程总数 <= 最大线程数
* int maximumPoolSize 最大线程数
* long keepAliveTime 存活时间
* TimeUnit unit 时间单位 (纳秒,毫秒,秒,分钟,....)
* BlockingQueue<Runnable> workQueue 阻塞队列
* @author Administrator
*
*/
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
// 20来源: 最大线程数 + 阻塞数目
ThreadPoolExecutor executor =
new ThreadPoolExecutor(10, 30, 2000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10)); for ( int i = 0; i < 40; i++) {
executor.execute(new MyRunnable());
System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" + executor.getQueue().size()
+ ",任务总数目:" + executor.getTaskCount());
} // 防止线程溢出(执行完成的线程会被及时关闭)
executor.shutdownNow();
} static class MyRunnable implements Runnable {
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println(threadName+ "准备执行......");
/*try {
// jdk1.5 之后官方推荐使用此方法睡眠
TimeUnit.MILLISECONDS.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
System.out.println(threadName+"执行完成......"); }
}
}

SingleThreadExecutor

package com.future.demo.threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 创建一个单线程的线程池。这个线程池只有一个线程在工作,
* 也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,
* 那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
* @author Administrator
*
*/
public class SingleThreadExecutorTest { public static void main(String[] args) {
MyThread t1 = new MyThread("AAA");
MyThread t2 = new MyThread("BBB");
MyThread t3 = new MyThread("CCC");
MyThread t4 = new MyThread("DDD"); ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
// 保证在线程池中的线程执行的顺序
singleThreadExecutor.execute(t4);
singleThreadExecutor.execute(t1);
singleThreadExecutor.execute(t2);
singleThreadExecutor.execute(t3); singleThreadExecutor.shutdown();
} } class MyThread extends Thread {
private String name;
public MyThread(String name) {
super(name);
this.name = name;
} @Override
public void run() {
System.out.println(name+"执行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
FixedThreadExecutor
package com.future.demo.threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
* 线程池的大小一旦达到最大值就会保持不变,
* 如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
* @author Administrator
*
*/
public class FixedThreadExecutorTest { public static void main(String[] args) {
MyThread t1 = new MyThread("AAA");
MyThread t2 = new MyThread("BBB");
MyThread t3 = new MyThread("CCC");
MyThread t4 = new MyThread("DDD"); ExecutorService singleThreadExecutor = Executors.newFixedThreadPool(2); singleThreadExecutor.execute(t1);
singleThreadExecutor.execute(t2);
singleThreadExecutor.execute(t3);
singleThreadExecutor.execute(t4); singleThreadExecutor.shutdown();
} }
CacheThreadExecutor
package com.future.demo.threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,
当任务数增加时,此线程池又可以智能的添加新线程来处理任务。
此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小
* @author Administrator
*
*/
public class CacheThreadExecutorTest { public static void main(String[] args) {
MyThread t1 = new MyThread("AAA");
MyThread t2 = new MyThread("BBB");
MyThread t3 = new MyThread("CCC");
MyThread t4 = new MyThread("DDD"); ExecutorService singleThreadExecutor = Executors.newCachedThreadPool(); singleThreadExecutor.execute(t1);
singleThreadExecutor.execute(t2);
singleThreadExecutor.execute(t3);
singleThreadExecutor.execute(t4); singleThreadExecutor.shutdown();
} }
ScheduledThreadExecutor
package com.future.demo.threadPool;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /***
* 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
* @author Administrator
*
*/
public class ScheduledThreadExecutorTest {
public static void main(String[] args) {
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(2); exec.scheduleAtFixedRate(new Runnable() {// 每隔一段时间就触发异常 @Override
public void run() { System.out.println("================"); } }, 1, 1, TimeUnit.SECONDS); exec.scheduleAtFixedRate(new Runnable() {// 每隔一段时间打印系统时间,证明两者是互不影响的 public void run() { System.out.println(System.nanoTime()); } }, 1, 100, TimeUnit.MILLISECONDS); }
}

线程组

ThreadGroup
package com.future.demo.threadgroup;

public class ThreadGroupTest {
public static void main(String[] args) throws Exception {
ThreadGroup group = new ThreadGroup("main Thread");
Thread t1 = new Thread(group,"AAA") {
@Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName()+"执行");
}
}
};
Thread t2 = new Thread(group,"BBB") {
@Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName()+"执行");
}
}
}; t1.start();
t2.start(); Thread.sleep(5000); System.out.println(Thread.currentThread().getThreadGroup().activeCount()); group.list();
}
}
package com.future.demo.conn;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock; public class NormalConnectionPool {
private Map<String, Connection> connPool = new HashMap<String, Connection>();
private ReentrantLock lock = new ReentrantLock(); public Connection getConnection(String key) { Connection conn = null; try {
lock.lock(); if (connPool.containsKey(key)) {
conn = connPool.get(key);
} else {
// 创建连接对象
conn = crateConn();
connPool.put(key, conn);
} } catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
} return conn;
} private Connection crateConn() {
return new Connection();
} public static void main(String[] args) throws Exception {
NormalConnectionPool pool = new NormalConnectionPool();
long start = System.currentTimeMillis(); Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 200000; i++) {
Connection conn = pool.getConnection("KK");
System.out.println("KK-----"+conn);
}
}
}); Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 200000; i++) {
Connection conn = pool.getConnection("YY");
System.out.println("YY-----"+conn);
}
}
}); Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 200000; i++) {
Connection conn = pool.getConnection("FF");
System.out.println("FF-----"+conn);
}
}
}); t1.start();t2.start();t3.start();
t1.join();t2.join();t3.join(); long end = System.currentTimeMillis();
System.out.println(end - start);
}
} class Connection { }
package com.future.demo.conn;

import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; public class SuperConnectionPool { private ConcurrentHashMap<String, FutureTask<Connection>> connPool = new ConcurrentHashMap<>(); public Connection getConnection(String key) {
Connection conn = null;
FutureTask<Connection> connectionTask = connPool.get(key); if (connectionTask != null) {
try {
conn = connectionTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
} else {
Callable<Connection> callable = new Callable<Connection>() { @Override
public Connection call() throws Exception {
return new Connection();
} };
FutureTask<Connection> newTask = new FutureTask<>(callable);
connPool.putIfAbsent(key, newTask);
if (connectionTask == null) {
connectionTask = newTask;
connectionTask.run();
}
} try {
conn = connectionTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} return conn;
} public static void main(String[] args) throws InterruptedException {
SuperConnectionPool pool = new SuperConnectionPool();
long start = System.currentTimeMillis(); Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 200000; i++) {
Connection conn = pool.getConnection("KK");
System.out.println("KK-----"+conn);
}
}
}); Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 200000; i++) {
Connection conn = pool.getConnection("YY");
System.out.println("YY-----"+conn);
}
}
}); Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 200000; i++) {
Connection conn = pool.getConnection("FF");
System.out.println("FF-----"+conn);
}
}
}); t1.start();t2.start();t3.start();
t1.join();t2.join();t3.join(); long end = System.currentTimeMillis();
System.out.println(end - start);
}
}

异步线程编程,线程池,线程组,后面涉及ThreadLocal在理解的更多相关文章

  1. 并发编程---线程queue---进程池线程池---异部调用(回调机制)

    线程 队列:先进先出 堆栈:后进先出 优先级:数字越小优先级越大,越先输出 import queue q = queue.Queue(3) # 先进先出-->队列 q.put('first') ...

  2. python并发编程-进程池线程池-协程-I/O模型-04

    目录 进程池线程池的使用***** 进程池/线程池的创建和提交回调 验证复用池子里的线程或进程 异步回调机制 通过闭包给回调函数添加额外参数(扩展) 协程*** 概念回顾(协程这里再理一下) 如何实现 ...

  3. Posix线程编程指南(4) 线程终止

    线程终止方式 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式:非正常终止是 ...

  4. Posix线程编程指南(2) 线程私有数据

    概念及作用 在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据.在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有.但有时应用程序设计中有必要提供 ...

  5. Posix线程编程指南(1) 线程创建与取消

    线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列.在串行程序基础上引入线程和进程是为了提高程序的 ...

  6. Linux 线程编程2.0——线程同步-互斥锁

    当我们需要控制对共享资源的存取的时候,可以用一种简单的加锁的方法来控制.我们可以创建一个读/写程序,它们共用一个共享缓冲区,使用互斥锁来控制对缓冲区的存取. 函数 pthread_mutex_init ...

  7. (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块

    一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...

  8. Posix线程编程指南(3) 线程同步

    互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thread中定义了另外一套专门用于线程同步的m ...

  9. Posix线程编程指南

    Posix线程编程指南 Posix线程编程指南... 1 一线程创建与取消... 2 线程创建... 2 1.线程与进程... 2 2. 创建线程... 2 3. 线程创建属性... 2 4. 创建的 ...

随机推荐

  1. SQLAlchemy tutorial

    SQLAlchemy tutorial 重要概念 ORM:数据库对象 <--> class --> 类实例instance 定义数据库连接 session:数据库事务通过sessio ...

  2. What is the difference between arguments and parameters?

    What is the difference between arguments and parameters? Parameters are defined by the names that ap ...

  3. Win7 disk.sys无法加载的问题

    Win7突然无法启动,应该说是启动中卡死,没有别的问题,用安全模式,显示加载disk.sys时卡死.搜索发现很多人遇到这个问题. 实际解决方法是查看数据线,重新插拔,换口,换线. 数据线出现故障往往表 ...

  4. 树莓派使用samba

    tips:打算利用树莓派做局域网内的文件共享服务器, 实测发现树莓派挂载一个硬盘比较合适,挂载多个硬盘则会出现供电不足而挂载失败, 即使利用外置供电接入多个硬盘实测效果也不好,树莓派在IO上无法处理多 ...

  5. EntityFramework 二

    特性 用来具体的设置数据库属性   [Table("表名")]//设置表名 public class User { [Key] //设置主键 [Column("列名&qu ...

  6. Jmeter中模拟多用户执行多场景操作

    1.其实一个用户组就是一个场景(Thread Group).可以在一个测试计划中进行多个场景的执行,在测试计划下加一个全局的User Defined Variables,在这个里面可以设置执行总数to ...

  7. 定位前后端bug

      说明 1 : js是静态资源,会缓存到浏览器的客户端,为了清除缓存,需要强制刷新页面,所有的东西强制的到服务器上拿一下 说明 2 :http状态码,服务器响应的一个状态码,标记不同的处理结果 说明 ...

  8. [剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)

    c++里面stack,queue的pop都是没有返回值的, vector的pop_back()也没有返回值. 思路: 队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2. ...

  9. CRM系统 - 总结 (一) 权限

    1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身 ...

  10. Ubuntu下使用crontab部署定时任务

    Ubuntu下使用crontab部署定时任务 安装cron apt-get install cron 开启crontab日志 默认情况下的日志是没有开启的,我们需要找到 /etc/rsyslog.d/ ...