线程

Java多线程开发

一.并发和进程

a) 多任务操作系统:可以同时执行运行多个软件。

b) 进程:运行在PC上的某一个软件。

c) 单核CPU多任务的机制:使得多个线程轮流使用CPU资源。微观串行,宏观并行

d) 时间片:进程使用CPU的时间

二.Java于多进程

a) Java可是实现多进程开发吗?不可以。

三.多线程开发

a) 线程:进程执行过程中的一个程序流程。

b) 线程的实现:

  1. 继承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);

}

}

}

 

 

  1. 实现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);

}

}

}

 

  1. 两种线程实现方式的区别:
    1. 如果需求中需要实现资源共享的要求,最好使用实现Runnable接口的方式。
    2. 如果需要实现多继承操作时,则必须使用Runnable的形式。

 

三.线程的状态图

 

四.线程的调度

a) 线程的优先级:线程对象中优先级越高则该线程就可以获得更多被运行的机会。

  1. 通过线程对象中的setPriority(int p);可以设置线程的优先级。线程优先级的值从低到高依次为:0 5 10 值越高线程优先级越高。

   Bvoid sleep(long millis):参数表示毫秒数,该方法可以使得线程转为阻塞状态。

Cvoid join()t.join(),让当前线程等待t线程结束之后在结束.当前线程指的就是t.join()该行代码存在的那个线程。

 

五.线程同步

a) 原子操作:不可分开执行的代码。

b) 线程锁机制:

  1. synchronized(obj){ 原子操作代码......}此处的代码块被成为同步代码块。
    1. 作用:如果一个线程要访问同步代码块中的代码,那么该线程必须获取obj所指向的对象的互斥锁标记。
    2. 对象的互斥锁标记: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(); }

   }

 

posted @ 2017-08-21 18:53  韩杜娟90  阅读(108)  评论(0编辑  收藏  举报