Concurrent - 多线程
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11426916.html
Java中有几种方法可以实现一个线程?
- 继承Thread类(不支持多继承)
- 实现Runnable接口
- 实现Callable接口
- 线程池ThreadPoolExecutor
Note:
Callable接口和Runnable接口区别
- Callable接口的call()方法可以返回值,而Runnable接口的run()方法没有返回值
- Callable接口的call()方法可以声明抛出异常,而Runnable接口的run()方法不可以声明抛出异常
类ThreadPoolExecutor可以非常方便地创建线程池对象,而不需要程序员设计大量的new实例化Thread相关的代码
如何停止一个正在运行的线程?
使用flag,使线程正常退出,也就是当run方法完成后线程终止
package org.fool.java.concurrent.thread; public class ThreadFlagTest {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread(); Thread t1 = new Thread(myThread);
t1.start(); Thread.sleep(1000); myThread.stop();
} public static class MyThread implements Runnable {
private volatile boolean flag = true; public void stop() {
flag = false;
} @Override
public void run() {
while (flag) {
System.out.println(Thread.currentThread().getName() + System.currentTimeMillis());
}
}
}
}
使用stop方法强行终止线程(不推荐,deprecated)
使用interrupt方法中断线程(调用interrupt方法仅仅是在当前线程中打了一个停止的flag,并不是真正的停止线程)
Note:
Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?
notify()和notifyAll()有什么区别?
notify是随机唤醒一个等待某个资源的线程,进入就绪队列等待CPU的调度
notifyAll是唤醒所有的,进入就绪队列等待CPU调度
sleep()和 wait()有什么区别?
sleep方法是在指定的时间内让正在执行的线程暂停执行,但不会释放锁。
wait方法是让当前线程等待,直到其他线程调用对象的notify或notifyAll方法。wait方法会释放掉锁,使别的线程有机会占用锁。
什么是Daemon线程?它有什么意义?
Java线程类型:
- 用户线程
- 守护线程
守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的引用就是GC。
Java如何实现多线程之间的通讯和协作?
同步和互斥,等待/通知机制
可以使用synchronized/wait/notify/notifyAll,Lock/Condition, Semaphore/CountDownLatch/CyclicBarrier/Phaser
ThreadLocal作用?
通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,比如定义一个static变量,同步访问 —— 数据共享,而ThreadLocal采用了“以空间换时间”的方式 —— 数据隔离。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
Concurrent - 多线程的更多相关文章
- [Java Concurrent] 多线程合作 producer-consumers / queue 的简单案例
在多线程环境下,通过 BlockingQueue,实现生产者-消费者场景. Toast 被生产和消费的对象. ToastQueue 继承了 LinkedblockingQueue ,用于中间存储 To ...
- B1. Concurrent 多线程的创建
[概述] 多线程的创建常用的有两种方法:1). 继承 Thread 类: 2). 实现 Runnable 接口: 3). 实现 Callable 接口. [继承 Thread 类] /** * 1. ...
- java.util.concurrent 多线程框架
http://daoger.iteye.com/blog/142485 JDK5中的一个亮点就是将Doug Lea的并发库引入到Java标准库中.Doug Lea确实是一个牛人,能教书,能出书,能编码 ...
- [Java Concurrent] 多线程合作 wait / notifyAll 的简单案例
本案例描述的是,给一辆汽车打蜡.抛光的场景. Car 是一辆被打蜡抛光的汽车,扮演共享资源的角色. WaxOnCommand 负责给汽车打蜡,打蜡时需要独占整部车,一次打一部分蜡,等待抛光,然后再打一 ...
- Concurrent.Thread.js
(function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'functi ...
- 收藏的技术文章链接(ubuntu,python,android等)
我的收藏 他山之石,可以攻玉 转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/ 开发过程中收藏在Chrome书签栏里的技术文 ...
- asyncio与gevent并发性能测试
asyncio与gevent并发性能测试 在对网站进行扫描或者暴破时需要对网站进行高并发操作,然而requests+concurrent多线程性能上不太理想,了解到python用得比较多的并发库有as ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- 多线程java的concurrent用法详解(转载)
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...
随机推荐
- 【leetcode】1022. Sum of Root To Leaf Binary Numbers
题目如下: Given a binary tree, each node has value 0 or 1. Each root-to-leaf path represents a binary n ...
- js-放大镜效果
jd或者淘宝的具体商品有个放大镜的效果.虽然网上类似插件琳琅满目,应用到项目上有诸多不便,自己抽点时间自己写了个类似插件,积累下代码,何乐而不为呢!!let‘go: 打算把此特效封装成个插件,先把最基 ...
- Mac 上使用svn 记录
.启动svn服务器 svnadmin create /Users/liuwei/Desktop/svn/UI 如果本地有 UI这个目录了就不用再运行 使用这句就可以了 svnserve -d -r / ...
- php htmlspecialchars()函数 语法
php htmlspecialchars()函数 语法 作用:函数把预定义的字符转换为 HTML 实体.预定义的字符有:& (和号)成为 &," (双引号)成为 " ...
- BottomNavigationBar 自定义 底部导航条
在flutter中,BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold 组件的参数. BottomNav ...
- vue将页面导出成pdf
npm i jspdf-html2canvas prinOut(){ // 导出pdf let page = document.querySelector('.app-main'); // page ...
- [CSP-S模拟测试]:养花(分块)
题目描述 小$C$在家种了$n$盆花,每盆花有一个艳丽度$a_i$.在接下来的$m$天中,每天早晨他会从一段编号连续的花中选择一盆摆放在客厅,并在晚上放回.同时每天有特定的光照强度$k_i$,如果这一 ...
- Unzip 解压报错
$ jar xvf pcre-8.10.zip 如果出现 jar:Command not found 要用yum下载 $ yum -y install java-1.6.0-openjdk-d ...
- laravel 中url使用
url() 通过url辅助函数(路由)生成:location.href = "{{url('user/index')}}"; 或者:location.href = "{{ ...
- Day 45 Mysql 数据库练习题二
1.表关系 注意:创建表时,根据合理性设置字段的长度和类型. 2.下面:开始你的表演 1.查询所有人员信息 select * from ren 2.只查询人员的姓名和年龄 select name, ...