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)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...
随机推荐
- ubuntu默认root密码
安装完Kubuntu后一直都是用我的用户名bbking登录, 一直没想到root的问题, 以为每次sudo输入的密码就是我的root密码. 刚才为了修改文件夹的所有者,想使用su root切换到roo ...
- Java BTrace实战(1)--BTrace的入门和使用
前言: 对线上的java服务, 往往采用日志进行问题处理和分析. 倘若日志缺乏相关的信息时, 那又该如何处理? 远程调试会影响服务的正常工作, 修改代码重新部署的方案其实时性和灵活性难以保证(线上服务 ...
- centos 服务器操作
CENTOS下创建FTP登录用户 yum install vsftpd2.启动/重启/关闭vsftpd服务器[root@localhost ftp]# /sbin/service vsftpd re ...
- Codeforces Round #313 (Div. 2) A B C 思路 枚举 数学
A. Currency System in Geraldion time limit per test 2 seconds memory limit per test 256 megabytes in ...
- leetcode 101 Symmetric Tree ----- java
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- poj3553 拓扑序+排序贪心
题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- 硬链接与软连接[转自vbird]
前言 在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录),这种是软链接: 另一种则是透过文件系统的 inode 连结来产生新档 ...
- python主文件判断
目录结构: myfile1.py.myfile2.py.myfile3.py代码都是打印文件名和__name__变量,如myfile1.py: print("myfile1",__ ...
- flash全屏输入模式
params.allowscriptaccess = "sameDomain"; params.allowfullscreen = "true"; params ...