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)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...
随机推荐
- python numpy 模块简单介绍
用python自带的list去处理数组效率很低, numpy就诞生了, 它提供了ndarry对象,N-dimensional object, 是存储单一数据类型的多维数组,即所有的元素都是同一种类型. ...
- Mvc3.0_笔记
1.保留文本框中的值:<p>Find @Html.TextBox("searchKey", ViewBag.Filter as string)</p> 这 ...
- 铺地毯 2011年NOIP全国联赛提高组
题目描述 Description 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从 ...
- 1-1 Windows应用程序的特点
主要内容:介绍Windows应用程序的特点,并附加了消息和事件的一些区别 //以后该分类中字体均采用 隶书 4(14pt) 1. 面向对象 <1>针对Windows应用本身,如记事本界面, ...
- 关于kafka连接不上别的机器问题Connection refused
1.确认config里面的server.properties 正确(包括IP+端口2181记得看清,用hostname的话记得etc/hostnames下面查看全部配置上没,建议用hostname方便 ...
- 用Spring的mappingDirectoryLocations来配置Hibernate映射文件
在Spring的applicationContext.xml中配置映射文件的方法: <property name="mappingResources"> < ...
- 文件的搜寻【转vbird】
which (寻找『运行档』) [root@www ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 分 ...
- dll--二进制层面的复用
积木式思想其实是很自然的一个过程,从c的库函数到C++的标准库,再到dll.com.com+都是这种思想推动下的结果,和现实生活中的人们的思维方式并无二致,只不过软件是在一个虚拟的世界中,并分化出许多 ...
- Processor Speculative & pipeline
https://en.wikipedia.org/wiki/Instruction-level_parallelism https://en.wikipedia.org/wiki/Instructio ...
- Oracle升级前备份和失败回退
一.升级前备份 1.软件备份[root@localhost backup]# su - oracle [oracle@localhost ~]$ cd $ORACLE_HOME[oracle@loca ...