java线程
2016-03-05 12:56
253 查看
线程:就是进程中一个负责程序执行的控制单元(执行路径),
一个进程中可以多执行路径,称之为多线程。
一个进程至少有一个线程
开启多个线程是为了同时运行多部分代码
每一个线程都有自己运行的内容,这个内容可以称为要执行的任务。
多线程好处:解决了多部分同时运行的问题
多线程弊端:线程太多回收的效率降低
jvm创建的主线程的任务都定义在了主函数中
自定义线程是通过Thread类中的run方法来体现,
run方法就是封装自定义线程运行任务的函数
run方法中定义的就是线程要运行的任务代码
调用start执行
可以通过Thread的getName()获取线程的名称,Thread-编号(从0开始)
主线程名字就是main
线程的状态:
start:开始线程
sleep: 睡眠
wait:等待
notify: 唤醒
stop:强制结束
临时阻塞状态
CPU执行资格:可以被CPU的处理,在处理队列中排队
CPU执行权:正在被CPU的处理
创建线程的第一种方式:
extends Thread();
创建线程的第二种方式(常用):
1.定义类实现Runnable接口
2.覆盖接口中的run方法,将线程的任务代码封装到run方法中
3.通过Thread类创建线程对象,并将Runnable接口的子类对象
作为Thread类的构造函数的参数进行传递(线程的任务都封装在
Runnble接口子类对象的run方法中,所以要在线程对象创建时就
必须明确要运行的任务)
4.调用线程对象的start方法开启线程
实现Runnable接口的好处:
1.将线程的任务从线程的子类中分离出来,进行了单独的封装
2.避免了java单线程的局限性
产生线程安全问题的原因:
1.多个线程在操作共享数据
2.操作共享数据的代码有多条
当一个线程在执行操作共享数据的多条代码过程
中其他线程参与了运算,就会导致线程安全问题的产生
用同步代码块解决多线程异常问题:synchronized
同步的好处:解决了多线程的安全问题
同步的弊端:相对降低了效率,因为同步外的
线程都会判断同步锁
死锁程序:
class Test{
private boolean flag;
Test(boolean flag){
this.flag=flag;
}
public void run(){
if(flag){
synchronized(MyLock.locka){
synchronized(MyLock.lockb){}
}
}else{
synchronized(MyLock.lockb){
synchronized(MyLock.locka){}
}
}
}
class MyLock{
public static final Object locka = new Object();
public static final Object lockb = new Object();
}
class Run{
public static void mian(String[] args){
Test a = new Test(true);
Test b = new Test(false);
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
}
}
等待/唤机制
涉及的方法:
1.wait():让线程处于冻结状态,被wait的线程会被
存储到线程池中
2.notify():唤醒线程池中的一个线程(任意)
3.notifyAll():唤醒线程池中的所有线程
线程间通信-多生产者多消费者问题
wai和sleep的区别:
1.wait可以指定时间也可以不指定
sleep必须指定时间
2.在同步中时,对cpu的执行权和锁的处理不同
wait:释放执行权,释放锁
sleep:释放执行权,不释放锁
停止线程:
1.stop方法
2.run方法结束
守护线程:setDaemon
其他方法join:
jion:等待该线程终止
一个进程中可以多执行路径,称之为多线程。
一个进程至少有一个线程
开启多个线程是为了同时运行多部分代码
每一个线程都有自己运行的内容,这个内容可以称为要执行的任务。
多线程好处:解决了多部分同时运行的问题
多线程弊端:线程太多回收的效率降低
jvm创建的主线程的任务都定义在了主函数中
自定义线程是通过Thread类中的run方法来体现,
run方法就是封装自定义线程运行任务的函数
run方法中定义的就是线程要运行的任务代码
调用start执行
可以通过Thread的getName()获取线程的名称,Thread-编号(从0开始)
主线程名字就是main
线程的状态:
start:开始线程
sleep: 睡眠
wait:等待
notify: 唤醒
stop:强制结束
临时阻塞状态
CPU执行资格:可以被CPU的处理,在处理队列中排队
CPU执行权:正在被CPU的处理
创建线程的第一种方式:
extends Thread();
创建线程的第二种方式(常用):
1.定义类实现Runnable接口
2.覆盖接口中的run方法,将线程的任务代码封装到run方法中
3.通过Thread类创建线程对象,并将Runnable接口的子类对象
作为Thread类的构造函数的参数进行传递(线程的任务都封装在
Runnble接口子类对象的run方法中,所以要在线程对象创建时就
必须明确要运行的任务)
4.调用线程对象的start方法开启线程
实现Runnable接口的好处:
1.将线程的任务从线程的子类中分离出来,进行了单独的封装
2.避免了java单线程的局限性
产生线程安全问题的原因:
1.多个线程在操作共享数据
2.操作共享数据的代码有多条
当一个线程在执行操作共享数据的多条代码过程
中其他线程参与了运算,就会导致线程安全问题的产生
用同步代码块解决多线程异常问题:synchronized
同步的好处:解决了多线程的安全问题
同步的弊端:相对降低了效率,因为同步外的
线程都会判断同步锁
死锁程序:
class Test{
private boolean flag;
Test(boolean flag){
this.flag=flag;
}
public void run(){
if(flag){
synchronized(MyLock.locka){
synchronized(MyLock.lockb){}
}
}else{
synchronized(MyLock.lockb){
synchronized(MyLock.locka){}
}
}
}
class MyLock{
public static final Object locka = new Object();
public static final Object lockb = new Object();
}
class Run{
public static void mian(String[] args){
Test a = new Test(true);
Test b = new Test(false);
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
}
}
等待/唤机制
涉及的方法:
1.wait():让线程处于冻结状态,被wait的线程会被
存储到线程池中
2.notify():唤醒线程池中的一个线程(任意)
3.notifyAll():唤醒线程池中的所有线程
线程间通信-多生产者多消费者问题
wai和sleep的区别:
1.wait可以指定时间也可以不指定
sleep必须指定时间
2.在同步中时,对cpu的执行权和锁的处理不同
wait:释放执行权,释放锁
sleep:释放执行权,不释放锁
停止线程:
1.stop方法
2.run方法结束
守护线程:setDaemon
其他方法join:
jion:等待该线程终止
相关文章推荐
- eclipse 导入XUtils 的 demo
- java基础知识介绍
- Struts2中的OGNL详解 《转》
- java io
- com.springframework.web.client.RestTemplate
- struts2基础
- Java内部类分类
- java基础-001
- javascrip cookie
- eclipse运行web project经验
- LeetCode : Longest Palindromic Substring [java]
- java类反射
- spring
- jdk API标记接口
- java中文件和流处理
- JAVA数据类型讲解
- java静态方法与非静态方法有什么区别?
- jdk和jre的区别
- Spring @Transactional (一)
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener错误的问题的原由