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)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...
随机推荐
- windows Batch 脚本的一些常用有效
也是非常的有用的.比如要想要删除目录下的同一文件名的东西. del /S filename 就可以连同子目录下的同文件名一起删除 . 再比如你想要COPY 文件到子目录下的时候. for /D %%i ...
- 标准盒模型与ie盒模型
ff(标准的盒模型) Box的宽高包括 padding .border.margin.content区域 ie Box的宽度包括 margin content区域(content区域包含paddi ...
- launch文件概述---1
摘要: 原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 资源链接:http://wenku.baidu.com/link?url=PhyN3C6ghqo ...
- System program problem detected 解决
每次开机都出现:System program problem detected 管理员权限打开:/etc/default/apport su root vim /etc/default/app ...
- new总结
基础:c++中,什么时候用 A a;和什么时候用A a=new A; new是在堆上分配内存,它需要用delete释放,否则会造成内存泄漏(使用的内存没有即时释放,造成内存的浪费) int main( ...
- leetcode 147. Insertion Sort List ----- java
Sort a linked list using insertion sort. 插入排序. /** * Definition for singly-linked list. * public cla ...
- spark与storm的对比
对比点 Storm Spark Streaming 实时计算模型 纯实时,来一条数据,处理一条数据 准实时,对一个时间段内的数据收集起来,作为一个RDD,再处理 实时计算延迟度 毫秒级 秒级 吞吐量 ...
- PHP浮点型
<?php$num_float1 = 1.234; //小数点echo $num_float1;echo "<br />";$num_float2 = 1. ...
- Hammer.js移动端触屏框架的使用
hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...
- Android——不同activity之间数据传递
/* * 不同activity之间数据的传递 */ public class MainActivity extends Activity { private EditText et_name; @Ov ...