一、线程池相关

ExecutorService

Callable与Runnable

Callable可以返回结果,但是runnable不行。

上代码:

public class TestCallable implements Callable{

@Override

public String call() throws Exception {

Thread.sleep(3000);

return "Hello World";

}

}复制代码

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TestCallable testCallable = new TestCallable();

ExecutorService executorService = Executors.newSingleThreadExecutor();

Future future = executorService.submit(testCallable);

try {

System.out.println(future.get());

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

System.out.println("11111111111111");

}复制代码

可以发现我在TestCallable里加了个sleep,程序还是会后打印"111111111111"那一个串,说明TestCallable的线程会阻塞主线程,真正原因是future.get()会阻塞当前线程,直到callable的call方法结束 。

CountDownLatch

可以阻塞当前线程,等待另外一个线程执行完结果后将结果同步返回,异步转同步。

异步转同步需要注意

1)异步的数据一定要是在子线程里,否则会造成当前线程卡顿。

2)如果需要在主线程里同步返回数据,但是取数据走的是子线程,子线程不要使用new Handler(Looper.getMainLooper()) 来做延时操作,否则会造成子线程回调无法countDownLatch减小,最终主线程一直在等待。

在子线程中使用Handler的方法:

HandlerThread handlerThread = new HandlerThread("纯24协议对接收到的数据进行分析"){};

handlerThread.start();

mHandler = new Handler(handlerThread.getLooper());复制代码

3)await方法在开其他线程之后再执行,否则其他线程还没有开启起来就把当前线程阻塞了。

二、线程交互

1.唤醒与等待(wait与notify)

常见异常:http://blog.csdn.net/zhouxiaoyun0228/article/details/7757313

注意事项:1)唤醒与等待是有严格的使用条件的,对象监听器只能在所监听的线程内调用。

2)wait与notify只能在同步代码块里调用

3)一般一个任务同步方法执行完,调用监听器wait当前线程。

4)wait与notify虽然是object的方法,但是作用是作为锁来控制线程。

5)wait与notify更适用于两个或多个协同工作的线程

代码实例:

2个交互的线程类:

public class MyThread1 extends Thread{

private Object lock;

private int index = 0;

public MyThread1(Object lock){

this.lock = lock;

}

@Override

public void run(){

synchronized (lock) {

while (true){

System.out.println("MyThread1 "+System.currentTimeMillis());

index++;

if(index == 10){

lock.notify();

break;

}

if(index % 5 == 0){

try {

lock.notify();

System.out.println("MyThread1 wait");

lock.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

}复制代码

public class MyThread2 extends Thread{

private Object lock;

private int index = 0;

public MyThread2(Object lock){

this.lock = lock;

}

@Override

public void run(){

synchronized (lock) {

while (true){

System.out.println("MyThread2 "+System.currentTimeMillis());

index++;

if(index == 10){

lock.notify();

break;

}

if(index % 5 == 0){

try {

lock.notify();

System.out.println("MyThread2 wait");

lock.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

}复制代码

2个交互线程的任务调用类:

public class Thread1Tasker implements ITask{

private Object lock;

private final static Thread1Tasker instance = new Thread1Tasker();

public final static Thread1Tasker getInstance(){

return instance;

}

public Thread1Tasker setLock(Object lock) {

this.lock = lock;

return this;

}

@Override

public void start() {

MyThread1 t1 = new MyThread1(lock);

t1.start();

}

}复制代码

public class Thread2Tasker implements ITask{

private Object lock;

private final static Thread2Tasker instance = new Thread2Tasker();

public final static Thread2Tasker getInstance(){

return instance;

}

public Thread2Tasker setLock(Object lock) {

this.lock = lock;

return this;

}

@Override

public void start() {

MyThread2 t2 = new MyThread2(lock);

t2.start();

}

}复制代码

main方法里调用任务:

public class Test3 {

public static void main(String[] args) throws InterruptedException {

Object lock = new Object();

Thread1Tasker.getInstance().setLock(lock)

.start();

Thread2Tasker.getInstance().setLock(lock)

.start();

}

}复制代码

结果打印输出:

MyThread1 1516939281372

MyThread1 1516939281372

MyThread1 1516939281372

MyThread1 1516939281372

MyThread1 1516939281372

MyThread1 wait

MyThread2 1516939281374

MyThread2 1516939281374

MyThread2 1516939281374

MyThread2 1516939281374

MyThread2 1516939281374

MyThread2 wait

MyThread1 1516939281374

MyThread1 1516939281374

MyThread1 1516939281374

MyThread1 1516939281374

MyThread1 1516939281374

MyThread2 1516939281374

MyThread2 1516939281374

MyThread2 1516939281374

MyThread2 1516939281374

MyThread2 1516939281374

可以发现2个线程任务是交替执行的

三、HandlerThread

四、InputStream阻塞

java中volatile关键字的含义

最后

喜欢的可以关注我的公众号,java小瓜哥的分享平台。平时整理的技术文和面试文还有许多资料都放在里面了

java 3000并发,还被面试官怼并发编程?来,吃点能量!Java并发编程技术相关推荐

  1. 10道虐心的Java面试题,被面试官虐哭了,同事一题都没答对

    10道虐心的Java面试题,被面试官虐哭了,同事一题都没答对 Java高级架构 有一天,小王告诉我,他去一家公司面试 Java 岗,结果被面试官虐哭了.整整 10 道 Java 面试题,小王一道也没答 ...

  2. java resume过时方法_面试官没想到,一个 Java 线程生命周期,我可以扯半小时

    面试官:你不是精通 Java 并发吗?从基础的 Java 线程生命周期开始讲讲吧. 好的,面试官.吧啦啦啦... 如果要说 Java 线程的生命周期的话,那我觉得就要先说说操作系统的线程生命周期 因为 ...

  3. 面试官:为什么单线程的Redis可以实现高并发访问

    背景 上回说到小枫在接受面试官的拷打,所幸第一个问题回答的还不错,因此面试官对于小枫的初步印象还行.我们接着来看看小枫是怎么和面试官继续过招的吧,他还能扛得住面试官几个连环炮呢? 面试官考察目的分析 ...

  4. 面试官:Zookeeper怎么解决读写、双写并发不一致问题,以及共享锁的实现原理?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  5. “金三银四”春招指南之“性能调优”:MySQL+Tomcat+JVM,看完还怕面试官的轰炸?

    春招指南之"性能调优":MySQL+Tomcat+JVM,还怕面试官的轰炸? 01 MySQL性能调优 1.1 MySQL性能调优问题有哪些?怎么学? 关于这个,给大家看一份学习大 ...

  6. 醒醒!临时抱佛脚背Java面试题的在面试官面前是根本没有用的

    醒醒!临时抱佛脚背Java面试题的在面试官面前是根本没有用的! Java架构老李 2020-11-19 17:17:09 744 收藏 33 分类专栏: Java 面试 编程语言 文章标签: 数据库 ...

  7. 面试阿里测试开发,面试结束后,还被面试官在朋友圈吐槽“什么阿猫阿狗都敢来面试大厂了吗?”

    前一阵子有个小徒弟向我诉苦,说自己在参加某大厂测试面试的时候被面试官怼得哑口无言,场面让他一度十分尴尬 印象最深的就是下面几个问题: 根据你以前的工作经验和学习到的测试技术,说说你对质量保证的理解? ...

  8. java线程泄露_面试官:小伙子先来说一下可能引起Java内存泄露的场景吧

    原标题:面试官:小伙子先来说一下可能引起Java内存泄露的场景吧 本文分析一下可能引起java内存泄露的场景: 通过 finalize 方法 终结器finalizers的使用是潜在内存泄漏问题的另一个 ...

  9. 唯一索引允许为空吗_一次 MySQL 索引面试,被面试官怼的体无完肤!

    之前有过一次面试,关于MySQL索引的原理及使用被面试官怼的体无完肤,立志要总结一番,然后一直没有时间(其实是懒--),准备好了吗? 索引是什么? 数据库索引,是数据库管理系统(DBMS)中一个排序的 ...

最新文章

  1. 【ACM】杭电OJ 2064(汉诺塔III)
  2. ECharts的简单使用过程
  3. s6-9 TCP 定时器
  4. xgboost算法_工业大数据:分析算法
  5. 测试计划剔除 log剔除_我是如何在整个公司面前被剔除的(以及为什么这样做很好)...
  6. 计算机组成原理脱机运算器实验数据,实验三:脱机运算器实验报告.pdf
  7. FreeRTOS源码分析与应用开发03:时间管理
  8. python基础知识-python基础知识(一)
  9. java当前时间长整数值_在Java中获取当前年份的整数值
  10. SPSS软件应用于因子分析/相关性分析等统计分析方法解读
  11. 面试反问环节“你有什么问题想问的”踩雷一记
  12. 图书馆管理系统(一)
  13. 高德地图独家携手东方时尚驾驶学校 共推“安全驾驶季”活动
  14. 静止卫星遥感图像太阳及卫星天顶、方位角(SOZ/SOA/SAZ/SAA)计算方法
  15. java qq邮箱发送端口号,MediaWiki 设置QQ邮箱SMTP(SSl方式)发送邮件
  16. 苹果手机计算机隐藏应用,操作如此简单 iPhone十大隐藏功能汇总
  17. 计算机小游戏有哪些,计算机有哪些单机游戏可以耐玩,4 G以下?
  18. HITNet: Hierarchical Iterative Tile Refinement Network for Real-time Stereo Matching--Google
  19. 360测试开发面试总结 -- 失败
  20. 宽和窄俯卧撑哪个更难_宽距俯卧撑与窄距俯卧撑,练出来的肌肉有什么差距?...

热门文章

  1. UVA10178 Count the Faces.【并查集】
  2. HDU1249 三角形【切割平面】
  3. JSK-23 计数和数数【数列】
  4. POJ NOI MATH-7649 我家的门牌号
  5. 命名 —— 函数、类的命名
  6. Tricks(三十三)—— 自定义 zipWithIndex
  7. C++::My Effective C++ (二)
  8. theano —— shared, function(outputs, updates, givens)
  9. theano 编程技巧
  10. php程序员述职材料_php程序员述职报告(精选多篇)