线程

Future

Callable 将一段代码包装在另外一个线程中执行
Future 是处理Callable计算后的结果 ExecutorService es = Executors.newSingleThreadExecutor(); // 创建单一线程
Future<String> result = es.submit(new Callable<String>(){
@Override
public String call() throws Exception {
Thread.sleep(10000); // 执行复杂代码块的线程停留10s
return "Complex Result";
}
});
System.out.println("Result of Complex Calculation is : " + result.get()); // get方法会阻塞当前线程,一直等待Callable执行结束
result.get(5, TimeUnit.SECONDS)) // 只会等待结果5s
result.cancel(true); // 终止线程
result.isDone(); // 线程是否结束
result.isCancelled(); // 线程是否取消

CountDownLatch

CountDownLatch 未执行的线程数

下面例子,演示如何等待5个线程依次执行完毕后,主线程才会执行
CountDownLatch latch = new CountDownLatch(5);
for (int n = 0; n < 5; n++) {
Thread t = new Thread(new Runnable(){ @Override
public void run() {
System.out.println("Do some thing");
latch.countDown(); // 执行完成一个线程,latch减一
}
});
t.start();
}
latch.await(); // 等待子线程执行完成
System.out.println("主线程 " + 5 + "threads");

Multithreading

for (int i = 1; i <= 4; i++) {
new Thread(new Runnable(){ @Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println("Instance : " + i);
}
}
}).start();
} for (int i = 0; i < 10000; i++) {
System.out.println("Main: " + i);
}

synchronized

控制单一线程访问资源

第一种
int count = 0;
public void doSomething() {
synchronized(this) {
++count;
}
} 第二种
Lock lockObj = new ReentrantLock()
lockObj.lock();
++count;
lockObj.unlock() 第三种
Lock lockObj = new ReentrantLock();
try {
try {
lockObj.lockInterruptibly();
++count;
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // stopping
}
} finally {
if (!Thread.currentThread().isInterrupted()) {
lockObj.unlock();
}
} 第四种
Lock lockObj = new ReentrantLock();
boolean locked = lockObj.tryLock();
if (locked) {
try {
++count;
} finally {
lockObj.unlock();
}
} 第五种
Semaphore 可以指定具体的允许连接数 Semaphore semaphore = new Semaphore(1); // 最多1个连接
Semaphore semaphore = new Semaphore(1, true); // 按顺序处理连接
semaphore.acquire();
++count;
semaphore.release(); 第六种
ReadWriteLock RW_LOCK = new ReentrantReadWriteLock();
RW_LOCK.writeLock().lock();
++count;
RW_LOCK.writeLock().unlock(); RW_LOCK.readLock().lock();
return data;
RW_LOCK.readLock().unlock();

Thread

创建线程

第一种
class MyThread extends Thread { public MyThread(String name) {
super(name); // 设置线程名称
} @Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Thread running!");
}
} }
MyThread t = new MyThread("MyThreadName"); // 线程开启 第二种
Thread t = new Thread(new Runnable(){ @Override
public void run() { }
}); 第三种
ThreadFactory threadfactory = new ThreadFactory(){ private int id = 0; @Override
public Thread newThread(Runnable r) {
return new Thread(r, "Worker " + id++);
}
};
threadfactory.newThread(...)

Producer-Consumer

BlockingQueue<Object> queue = new ArrayBlockingQueue<Object>(1000);
Runnable Producer = new Runnable(){
@Override
public void run() {
int producedCount = 0;
try {
while (true) {
producedCount++;
queue.put(new Object());
}
} catch (InterruptedException e) {
producedCount--;
Thread.currentThread().interrupt();
}
System.out.println("Produced " + producedCount + " objects");
}
}; Runnable Consumer = new Runnable(){
@Override
public void run() {
int consumedCount = 0;
try {
while (true) {
Object data = queue.poll(10, TimeUnit.MILLISECONDS);
// process data
consumedCount++;
}
} catch (InterruptedException e) {
consumedCount--;
Thread.currentThread().interrupt();
}
System.out.println("Consumed " + consumedCount + " objects");
}
};
Thread producer = new Thread(Producer);
Thread consumer = new Thread(Consumer); producer.start();
consumer.start(); Thread.sleep(1000);
producer.interrupt();
Thread.sleep(10);
consumer.interrupt();

获取线程状态

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
for (Thread t : threadSet) {
if (t.getThreadGroup() == Thread.currentThread().getThreadGroup()) {
System.out.println("Thread :" + t + ":" + "state:" + t.getState());
++threadCount;
}
}

线程池

ThreadPoolExecutor
ThreadPoolExecutor pool = new ThreadPoolExecutor(
1, // 保持一个线程一直存在
5, // 最多5个线程一起执行
1, // 最大空余的线程
TimeUnit.MINUTES, // 一分钟后终止空余线程
new ArrayBlockingQueue<Runnable>(10) // Runnables实例保存在此
) pool.execute(new Runnable() {
@Override public void run() {
//code to run
}
}); Executors ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(
new Runnable() {
@Override
public void run() {
for(int i = 0; i < 100; i++) {
System.out.println("子线程->" + i);
}
}
}
);

ThreadLocal

线程变量,只能在本线程中使用

创建线程变量
Thread thread = new Thread(new Runnable(){
ThreadLocal<String> str = new ThreadLocal<String>(){
@Override
protected String initialValue() {
return "线程变量";
}
};
// 简写 ThreadLocal<String> str = ThreadLocal.withInitial(() -> "线程变量"); @Override
public void run() {
System.out.println(str.get()); // "线程变量"
str.set("修改的线程变量");
System.out.println(str.get()); // "修改的线程变量"
}
});
thread.start();

原子类型

避免多线程占用,线程安全

AtomicInteger aInt = new AtomicInteger();
AtomicInteger aInt = new AtomicInteger(1);
AtomicIntegerArray aIntArray = new AtomicIntegerArray(10);
AtomicIntegerArray aIntArray = new AtomicIntegerArray(new int[] {1, 2, 3});

结语

本文章是java成神的系列文章之一

如果你想知道,但是本文没有的,请下方留言

我会第一时间总结出来并发布填充到本文

java成神之——线程操作的更多相关文章

  1. java成神之——数值操作BigDecimal,BigInteger,Random,SecureRandom

    数值操作 数值新特性 包装类 浮点 BigDecimal BigInteger 数值本地化 随机数 假随机数 真随机数 播种 结语 数值操作 数值新特性 123_456 等价于 123456,增加可读 ...

  2. java成神之——jaxb操作xml的基本使用

    JAXB 依赖 读取xml配置 写配置 自定义写配置 结语 JAXB 依赖 <dependency> <groupId>javax.activation</groupId ...

  3. java成神之——enum枚举操作

    枚举 声明 枚举遍历 枚举在switch中使用 枚举比较 枚举静态构造方法 使用类来模拟枚举 枚举中定义抽象方法 枚举实现接口 单例模式 使用静态代码快 EnumSet EnumMap 结语 枚举 声 ...

  4. java成神之——Stream和Optional

    Stream流 基本使用 流关闭 平行流 流重用 iterator转换成流 分组计数 无限流 流转集合 压缩流 统计数值流 集合转换流遍历 流拼接 reduce 使用流生成随机字符串 流的包装流 几种 ...

  5. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  6. Java成神路上之设计模式系列教程之一

    Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...

  7. java成神之——MySQL Connector/J 的基本使用

    使用示例 DBCP连接池 结语 使用示例 public class demo { static Connection con = null; static Statement st = null; s ...

  8. java成神之——文件IO

    文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStrea ...

  9. java成神之——正则表达式基本使用

    正则表达式 常用匹配规则 基本使用 标记符的使用 部分正则标记 正则表达式在字符串方法中的使用 结语 正则表达式 常用匹配规则 [abc] abc其中一个 [^abc] abc之外的一个 [a-z] ...

随机推荐

  1. ConEmu

    https://conemu.github.io/ https://github.com/Maximus5/ConEmu/releases 将控制台整合到一起的工具,支持cmd.powershell. ...

  2. 原生JS日历 + JS格式化时间格式

    公司项目中用到,以前没做过,废了好几个小时 终于做好了 先来效果图(暂时没写样式 凑合着看吧) 点击左右按钮都能改变月份 下方表格中的数据也会跟着变化 贴上代码 : html部分: <div s ...

  3. 【spark】SparkSession的API

    SparkSession是一个比较重要的类,它的功能的实现,肯定包含比较多的函数,这里介绍下它包含哪些函数. builder函数public static SparkSession.Builder b ...

  4. MySQL 实践

    一.下载MySQL 1.mysql-noinstall-5.1.73-win32.zip 2.mysql-connector-net-6.8.3.msi 二.安装MySQL 三.连接MySQL 1.A ...

  5. C#—序列化(Serialize)和反序列化(NonSerialize)

    (转自:http://www.cnblogs.com/Abel-Zhang/p/Serialize.html) 一.概述 序列化是把对象转变成流.相反的过程就是反序列化. 哪些场合用到这项技术呢? 1 ...

  6. Linux命令2018-03-01更新

    前言:Linux主要应用于服务器端,嵌入式开发和个人pc桌面端 本人wechat:YWNlODAyMzU5MTEzMTQ=. *** GPL GPL是一个开源许可协议,由自由软件基金会创建的.GPL许 ...

  7. [置顶] 【机器学习PAI实践三】雾霾成因分析

    一.背景 如果要人们评选当今最受关注话题的top10榜单,雾霾一定能够入选.如今走在北京街头,随处可见带着厚厚口罩的人在埋头前行,雾霾天气不光影响了人们的出行和娱乐,对于人们的健康也有很大危害.本文通 ...

  8. HAWQ取代传统数仓实践(七)——维度表技术之维度子集

    有些需求不需要最细节的数据.例如更想要某个月的销售汇总,而不是某天的数据.再比如相对于全部的销售数据,可能对某些特定状态的数据更感兴趣等.此时事实数据需要关联到特定的维度,这些特定维度包含在从细节维度 ...

  9. jmeter传入字符时文本显示乱码

    1.使用CSV Data Set Config组件传入参数,当传入的是字符串时,显示乱码 百度查看答案有用如下:

  10. Oracle新用户以及授权的若干问题

    Database 实验4 问题: 授权语句 grant create table to user_name; 收回授权语句 revoke create table from user_name; 注意 ...