Java-Thread
1. 线程的创建和启动
1.1 继承Thread
在run方法里,通过this获取当前线程。
多个线程不能共享实例变量。
1.2 通过实现接口
1.2.1 实现Runable接口
在run方法里,只能通过Thread.currentThread()获取当前线程。
多个线程可以共享实例变量。
1.2.2 使用Callable和Future
call()方法比run()方法更强大:
1. call()方法可以有返回值。
2. call()方法可以声明抛出异常。
注意:
- Callable对象不能直接作为Thread的target
- FutureTask类实现了Future接口和Runable接口,可以作为Thread的target
2. 线程的生命周期
- new new一个thread
- ready 调用start()
- run
- blocked
- terminated
- run()或call()方法正常结束
- 线程抛出Exception或Error
- 直接调用线程的stop()——容易导致死锁
当主线程结束时,其他线程不会受到影响,并不会随之结束。一旦子线程启动起来后,它就有和主线程相同的地位,它不会受主线程的影响。
3. 线程控制
3.1 join线程
调用者被阻塞,知道被调用线程执行完,调用者才会继续执行。
public class JoinThread extends Thread{ public JoinThread(String name){
super(name);
} public void run(){
for(int i=0;i<100;i++){
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) throws Exception {
new JoinThread("新线程").start();
for(int i=0;i<100;i++){
if(i == 20){
JoinThread jt = new JoinThread("被join的线程");
jt.start();
//main线程调用了jt线程的join()方法,main线程必须等待
//jt执行结束之后才会向下执行
jt.join();
}
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
3.2 后台线程
如果所有前台线程死亡,后台线程自动死亡。
前台线程创建的子线程,默认是前台线程。后台线程创建的子线程,默认是后台线程。
JoinThread jt = new JoinThread("被join的线程");
jt.setDaemon(true);
jt.start();
3.3 线程睡眠
Thread.sleep(3000);
3.4 线程让步
Thread.yield();
3.5 改变线程优先级
Thread.setPriority();
4. 线程同步
4.1 同步块synchronized statements
4.2 同步方法synchronized methods
单线程:StringBuilder
多线程:StringBuffer
同步方法,只对同一实例有效果,同一个类的不同实例的同一方法,是没有作用的。
4.3 同步监视器的释放
- 释放
- 当前线程的同步代码块和同步方法执行结束
- 当前线程,遇到了break、return终止了同步代码块和同步方法的执行
- 当前线程执行时,遇到了Error或Exception,异常结束时
- 当前线程执行同步代码块或同步方法时,程序调用了同步监视器的wait()方法
- 不释放
- 程序调用Thread.sleep()、Thread.yield()
- 其他线程调用当前线程的suspend()方法将当前线程挂起
4.4 同步锁
根接口:Lock、ReadWriteLock
实现类:ReentrantLock、ReentrantReadWriteLock、StampedLock
4.5 死锁
java虚拟机不检测死锁,也没有措施
5. 线程通信
5.1 传统
- wait()
- notify()
- notifyAll()
5.2 Lock and Condition
private final Lock lock = new ReentrantLock();
private final Condition cond = lock.newCondition();
...
cond.await();
cond.signal();
cond.signalAll();
5.3 BlockingQueue
6. 线程组
ThreadGroup
7. 线程池
- Executors
- ForkJoinPool
8. 线程相关类
8.1 ThreadLocal类
复制资源,不同的线程拥有不同的副本。
8.2 包装线程不安全的集合
HashMap m = Collections.synchronizedMap(new HashMap());
8.3 线程安全的集合
在java.util.concurrent包下
- Concurrent开头
- ConcurrentHashMap
- ConcurrentSkipListMap
- ConcurrentSkipListSet
- ConcurrentLinkedQueue
- ConcurrentLinkedDeque
- CopyOnWtrite开头
- CopyOnWriteArrayList
- CopyOnWriteArrayset
Java-Thread的更多相关文章
- Java Thread 的 sleep() 和 wait() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. sleep ...
- Java Thread 的 run() 与 start() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. ...
- Java Thread wait, notify and notifyAll Example
Java Thread wait, notify and notifyAll Example Java线程中的使用的wait,notify和nitifyAll方法示例. The Object clas ...
- java: Thread 和 runnable线程类
java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...
- Java Thread join() 的用法
Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: class ThreadTesterA imple ...
- Java thread jargon
In Java thread topic, the task to be executed and the thread to drive the task are two concepts shou ...
- 性能分析之-- JAVA Thread Dump 分析综述
性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...
- Java Thread线程控制
一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...
- [译]Java Thread wait, notify和notifyAll示例
Java Thread wait, notify和notifyAll示例 Java上的Object类定义了三个final方法用于不同线程间关于某资源上的锁状态交互,这三个方法是:wait(), not ...
- [译]Java Thread Sleep示例
Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...
随机推荐
- Install Fastx (zz)
Fastx-toolkit installation on CentOS ===================================== Tested on CentOS release ...
- 阿里云Centos中二级域名绑定二级目录的方法
对于一些目录,我们往往需要对其指定二级域名,那么具体如何操作呢?下面,我将用亲身实践来说明一下. 由于第一次接触centos,我不得不借助于网络资源.然后得知要开启mod_rewrite这个模块,具体 ...
- eclipse项目导入到android studio
只需要添加gradle文件,在里面添加如下代码片段------------------------------------------- main { manifest.srcFile 'Androi ...
- activiti 任务节点 处理人设置【转】
转自http://blog.csdn.net/qq_30739519/article/details/51225067 1.1.1. 前言 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自 ...
- Hibernate设置派生属性(formula)
一.Customer中包含的字段: private static final long serialVersionUID = 1L; private Integer id; private ...
- Ansible安装配置及使用
一.Ansible特点 1.不需要安装客户端,通过sshd通信 2.基于模块工作,模块可以由任何序言开发 3.不仅支持命令行使用模块,也支持编写yaml格式的playbook 4.支持sudo 5.有 ...
- Codeforces Round #125 (Div. 2)
A. Hexadecimal's theorem 三个数没有限制,直接输出\(0\ 0\ n\). B. Special Olympics 分包含和外离情况,包含分2种情况. C. About Bac ...
- P235 实战练习(集合类2)、摇奖程序和验证码(修改版)
1.分别向Set集合以及List集合中添加“A”.“a”.“c”.“C”.“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. package org.hanqi.practi ...
- lightoj1074 最短路
题意:有n个城市,每个城市有拥挤值,有一些单向道路,从某个城市到另一个城市的花费是拥挤值差的三次方,当然可能是负的值.问从1点到某点最少的花费,若小于3或不能到达输出“?” 建图的边权是拥挤值差的三次 ...
- 磁盘分区、格式化、挂载[转自vbird]
磁盘分区.格式化.挂载磁盘分区 新增分区 查询分区 删除分区磁盘格式化 mkfs mke2fs磁盘挂载与卸载 mount umount 磁盘的分区.格式化.挂 ...