线程
Java多线程开发
一.并发和进程
a) 多任务操作系统:可以同时执行运行多个软件。
b) 进程:运行在PC上的某一个软件。
c) 单核CPU多任务的机制:使得多个线程轮流使用CPU资源。微观串行,宏观并行
d) 时间片:进程使用CPU的时间
二.Java于多进程
a) Java可是实现多进程开发吗?不可以。
三.多线程开发
a) 线程:进程执行过程中的一个程序流程。
b) 线程的实现:
- 继承Thread类,并且覆盖run方法
Thread_1 t1=new Thread_1("t1");
Thread_1 t2=new Thread_1("t2");
//启动线程
t1.start();
t2.start();
class Thread_1 extends Thread{
String name;
Thread_1(String name){
this.name=name;
}
//线程执行的具体操作
public void run(){
for(int i=0;i<5;i++)
{
System.out.println(name+" 线程"+i);
}
}
}
- 实现Runnable接口,覆盖run方法
//创建了一个t1目标对象
Thread_2 t1=new Thread_2();
Thread t=new Thread(t1);//让当前线程对象t执行目标对象中的操作
t.start();
Thread tt=new Thread(t1);
tt.start();
class Thread_2 implements Runnable{
public void run(){
for(int i=0;i<5;i++)
{
System.out.println(" 线程"+i);
}
}
}
- 两种线程实现方式的区别:
- 如果需求中需要实现资源共享的要求,最好使用实现Runnable接口的方式。
- 如果需要实现多继承操作时,则必须使用Runnable的形式。
三.线程的状态图
四.线程的调度
a) 线程的优先级:线程对象中优先级越高则该线程就可以获得更多被运行的机会。
- 通过线程对象中的setPriority(int p);可以设置线程的优先级。线程优先级的值从低到高依次为:0 ,5 ,10 值越高线程优先级越高。
B)void sleep(long millis):参数表示毫秒数,该方法可以使得线程转为阻塞状态。
C)void join():t.join(),让当前线程等待t线程结束之后在结束.当前线程指的就是t.join()该行代码存在的那个线程。
五.线程同步
a) 原子操作:不可分开执行的代码。
b) 线程锁机制:
- synchronized(obj){ 原子操作代码......}此处的代码块被成为同步代码块。
- 作用:如果一个线程要访问同步代码块中的代码,那么该线程必须获取obj所指向的对象的互斥锁标记。
- 对象的互斥锁标记:Java中任意一个对象默认都会拥有一个互斥锁标记。互斥:同一时刻内,一个对象的互斥锁标记只可以被一个线程获取。如果某一个对象第一次被某一个线程对象所使用,则该线程对象就会获取该对象的互斥锁标记。如果该线程对象对象被执行结束之后,则释放该对象的互斥锁标记。
ii.同步方法:synchronized(this){ 原子操作代码......}可以改写成同步方法。Synchronized修饰的方法就是同步方法。
synchnized(obj1){代码块1}
synchnized(obj1){代码块2}
synchnized(obj3){代码块3}
如果线程t1正在执行代码块1,则另一个线程t2可不可以进入代码块2?能不你那个进入代码块3?
C)
synchnized(a)
{...; //1
a.wati();
synchronized(b){}
}
synchnized(b)
{...; //2
synchronized(a){
a.notify();
}
}
当前线程t1执行到了1的位置,t2线程执行到了2的位置,and then?
obj.wait():如果该方法被调用,则意味着持有obj对象互斥锁标记的线程会将obj对象的互斥锁释放,然后该线程进入等待状态。
obj.notify():如果该方法被调用,则意味着正在等该获得obj对象互斥锁标记的那个线程对象可以继续执行了。
解决死锁:
synchnized(a)
{...; //1
a.wait();
synchronized(b){}
}
synchnized(b)
{...; //2
synchronized(a){ a.notify(); }
}