线程、多线程同步、线程之间的通信

多线程,可以这样理解:

读一本书为一个线程,听一首歌为一个线程。当我们同时做这两件事的时候,要么听了歌曲,读完了书却不记得读了什么,或者读了书,却没有记住歌曲听的是什么。

CPU可以比作是大脑,读书和听音乐都是线程,每次CPU都只能执行一个线程,执行完一个线程才会执行下一个线程

 

Java中主要提供了两种方式实现线程:分别为继承java.lang.Therad类 和实现 java.lang.Runnable接口

 

Therad类:

为了方便查看   我将两个个类中的东西都写到了一起,中间用*******隔开的

package com.maya.Test;

public class MaYi extends Thread {

    private String name;         //成员变量

    public MaYi(String name){        //构造函数
        this.name=name;        
    }
    
    public void run(){                //run方法  线程执行的内容要写在这里面
        
        while(true){
        
                try {
                    Thread.sleep(2000);                        //延迟2000毫秒
                } 
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            
        System.out.println(this.name+"蚂蚁正在下载");
        
        }
        
    }
}


********************************************************************************************************

package com.maya.Test;

public class Test {

    public static void main(String [] args){
        
        MaYi my1=new MaYi("蚂蚁一号");            //造新的线程
        my1.start();
        
        MaYi my2=new MaYi("蚂蚁二号");
        my2.start();
        
        MaYi my3=new MaYi("蚂蚁三号");
        my3.start();
        
        MaYi my4=new MaYi("蚂蚁四号");
        my4.start();
        
        
        
    }
}

输出的结果如下

由此可以看出,多个线程同时执行时,并没有按照固定的顺序来执行,而是抢占CPU来执行自身,哪个抢到,哪个先执行

 

Runnable 接口

package com.maya.Test;

public class TuZi implements Runnable {

    private String name;
    
    public TuZi(String name){
        this.name=name;
    }
    
    @Override
    public void run() {
        while(true){
            
            try {
                Thread.sleep(2000);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            System.out.println(this.name+"兔子在跑");
        }

    }

}


**************************************************************************************************

package com.maya.Test;

public class Test {

    public static void main(String [] args){
        
        TuZi t=new TuZi("1号");
        Thread d=new Thread(t);
        d.start();
        
        TuZi t2=new TuZi("2号");
        Thread d2=new Thread(t2);
        d2.start();
        
        TuZi t3=new TuZi("3号");
        Thread d3=new Thread(t3);
        d3.start();
        
        
    }
}

在控制台中的结果同上;

 

多线程同步块:synchronized(参数){}

假设兔子3只兔子一共跑了100米,想要三个线程同步,即一只兔子跑了x米,其他兔子继续跑剩下的米数;

package com.maya.Test;

public class TuZiPao extends Thread {
    
    private static int changdu=100;
    private String name;
    private Object obj;
    
    public TuZiPao(String name, Object obj){
        
        this.name=name;
        this.obj =obj;
        
    }
    
    
    public void run(){
            while(true){
                
                synchronized (obj) {    //这里的obj相当于是一把钥匙

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
                changdu--;
                if(changdu<=0){
                    System.out.println("已经跑完了全程");
                    break;
                }
            System.out.println(name+"兔子跑了一米,还剩下"+changdu );
            
            
            
            
                }
            
            
            }

    }
    
}
**************************************************************************************************
package com.maya.Test;

public class Test {

    private  Object obj;
    public static void main(String [] args){
        
        Object obj=new Object();
        TuZiPao t=new TuZiPao("1号", obj);
        Thread d=new Thread(t);
        d.start();
        
        TuZiPao t2=new TuZiPao("2号",obj);
        Thread d2=new Thread(t2);
        d2.start();
        
        TuZiPao t3=new TuZiPao("3号",obj);
        Thread d3=new Thread(t3);
        d3.start();
        
        
    }
}

 

 线程的7种状态:  新生,就绪,执行,等待,休眠,死亡,阻塞

新生:new出来的时候

Therad s=new Therad();

就绪:start()

a.start()

执行:run()函数中的内容

public void run() {
        while(true){
            
            try {
                Thread.sleep(2000);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            System.out.println(this.name+"兔子在跑");
        }

    }

等待:notify()或者notifyall()

a.notify()

休眠 : therad.sclle(2000)

死亡 :线程结束

阻塞

posted @ 2017-01-12 21:00  赵天成123  阅读(615)  评论(2编辑  收藏  举报