One 许增宝

Java 中多线程
通过 Thread 类创建线程我的代码:package cn.onexzb.www; class MyThrea...
扫描右侧二维码阅读全文
01
2019/05

Java 中多线程

通过 Thread 类创建线程

我的代码:

package cn.onexzb.www;

class MyThread extends Thread{
    MyThread(String name){
        super(name);
    }
    public void run(){
        for(int i = 0; i < 10; i++){
            System.out.println(getName() + " " + i);
        }
    }
}

public class TestThread {
    
    public static void main(String[] args){
        MyThread mt1 = new MyThread("第一个线程");
        MyThread mt2 = new MyThread("第二个线程");
        mt1.start();
        mt2.start();
    }
}
/*输出结果:
 * 第一个线程 0
第二个线程 0
第一个线程 1
第二个线程 1
第一个线程 2
第一个线程 3
第一个线程 4
第一个线程 5
第二个线程 2
第一个线程 6
第二个线程 3
第二个线程 4
第二个线程 5
第二个线程 6
第二个线程 7
第二个线程 8
第二个线程 9
第一个线程 7
第一个线程 8
第一个线程 9
 */

通过 Runnable 创建线程

我的代码:

package cn.onexzb.www;

class PrintRunnable implements Runnable{

    int i;
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(i <= 10){
            System.out.println(Thread.currentThread().getName() + "--------" + (i++));
        }
    }
    
}

public class TestRunnable {
    public static void main(String[] args){
        PrintRunnable pr = new PrintRunnable();
        // 多个线程共享一个数据
        Thread mt = new Thread(pr);
        Thread mt1 = new Thread(pr);
        mt.start();
        mt1.start();
    }
}

线程的生命周期

线程的生命周期.png

sleep() 的使用

我的代码:

package cn.onexzb.www;

class PrintRunnable implements Runnable{
    public void run(){
        for(int i = 0; i < 30; i++) {
            System.out.println(Thread.currentThread().getName() + "执行第" + i + "次");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

public class TestSleep {
    public static void main(String[] args){
        PrintRunnable pr = new PrintRunnable();
        Thread mt = new Thread(pr);
        Thread mt1 = new Thread(pr);
        mt.start();
        mt1.start();
    }
}
/*输出结果:
Thread-1执行第0次
Thread-0执行第0次
Thread-0执行第1次
Thread-1执行第1次
Thread-1执行第2次
Thread-0执行第2次
Thread-1执行第3次
Thread-0执行第3次
Thread-0执行第4次
Thread-1执行第4次
Thread-1执行第5次
Thread-0执行第5次
Thread-1执行第6次
Thread-0执行第6次
Thread-0执行第7次
Thread-1执行第7次
Thread-0执行第8次
Thread-1执行第8次
Thread-0执行第9次
Thread-1执行第9次
Thread-1执行第10次
Thread-0执行第10次
Thread-0执行第11次
Thread-1执行第11次
Thread-1执行第12次
Thread-0执行第12次
Thread-0执行第13次
Thread-1执行第13次
Thread-0执行第14次
Thread-1执行第14次
Thread-1执行第15次
Thread-0执行第15次
Thread-1执行第16次
Thread-0执行第16次
Thread-1执行第17次
Thread-0执行第17次
Thread-1执行第18次
Thread-0执行第18次
Thread-1执行第19次
Thread-0执行第19次
Thread-1执行第20次
Thread-0执行第20次
Thread-1执行第21次
Thread-0执行第21次
Thread-1执行第22次
Thread-0执行第22次
Thread-1执行第23次
Thread-0执行第23次
Thread-1执行第24次
Thread-0执行第24次
Thread-1执行第25次
Thread-0执行第25次
Thread-1执行第26次
Thread-0执行第26次
Thread-1执行第27次
Thread-0执行第27次
Thread-1执行第28次
Thread-0执行第28次
Thread-1执行第29次
Thread-0执行第29次
*/

join() 方法的使用

我的代码:

package cn.onexzb.www;

public class TestJoin extends Thread{
    public void run(){
        for(int i = 0; i <= 10; i++)
        System.out.println(getName() + "执行第" + i + "次!");
    }
    
    public static void main(String[] args){
        TestJoin mt = new TestJoin();
        mt.start();
        try {
            // 意思为cpu分1毫秒给 mt ,1毫秒内
            // 无论mt 是线程是否执行完毕,都执行其他的
            mt.join(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("主线程结束!");
    }
}

线程优先级

我的代码:

package cn.onexzb.www;

public class TestJoin extends Thread{
    int i = 0;
    public void run(){
        for(; i <= 10; i++)
        System.out.println(getName() + "执行第" + i + "次!");
    }
    
    public static void main(String[] args){
        TestJoin mt = new TestJoin();
        TestJoin mt2 = new TestJoin();
        mt2.setPriority(MAX_PRIORITY);
        mt2.start();
        mt.start();
        try {
            // 意思为cpu分1毫秒给 mt ,1毫秒内
            // 无论mt 是线程是否执行完毕,都执行其他的
            mt.join(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("mt线程优先级:" + mt.getPriority());
        System.out.println("mt2线程优先级:" + mt2.getPriority());
        System.out.println("主线程优先级:"+ Thread.currentThread().getPriority());
    }
}
//Thread-0执行第0次!
//Thread-1执行第0次!
//Thread-0执行第1次!
//Thread-1执行第1次!
//Thread-0执行第2次!
//Thread-1执行第2次!
//Thread-0执行第3次!
//Thread-1执行第3次!
//Thread-0执行第4次!
//Thread-1执行第4次!
//Thread-1执行第5次!
//Thread-1执行第6次!
//Thread-1执行第7次!
//Thread-1执行第8次!
//Thread-1执行第9次!
//Thread-1执行第10次!
//Thread-0执行第5次!
//Thread-0执行第6次!
//Thread-0执行第7次!
//Thread-0执行第8次!
//Thread-0执行第9次!
//mt线程优先级:5
//Thread-0执行第10次!
//mt2线程优先级:10
//主线程优先级:5

线程间通信

/*******************Queue********************/
package cn.onexzb.www;

public class Queue {
    private int n;
    boolean flag=false;
    
    public synchronized int get() {
        if(!flag){
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("消费:"+n);
        flag=false;//消费完毕,容器中没有数据
        notifyAll();
        return n;
    }

    public synchronized void set(int n) {
        if(flag){
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("生产:"+n);
        this.n = n;
        flag=true;//生产完毕,容器中已经有数据
        notifyAll();
    }
    
}


/*******************Producer********************/
package cn.onexzb.www;

public class Producer implements Runnable{
    Queue queue;
    Producer(Queue queue){
        this.queue=queue;
    }

    @Override
    public void run() {
        int i=0;
        while(true){
            queue.set(i++);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    }

}

/*******************Consumer********************/
package cn.onexzb.www;

public class Consumer implements Runnable{
    Queue queue;
    Consumer(Queue queue){
        this.queue=queue;
    }

    @Override
    public void run() {
        while(true){
            queue.get();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
}

/*******************Test********************/
package cn.onexzb.www;

public class Test {
    public static void main(String[] args) {
        Queue queue=new Queue();
        new Thread(new Producer(queue)).start();
        new Thread(new Consumer(queue)).start();
    }
}

/*输出结果:
生产:0
消费:0
生产:1
消费:1
生产:2
消费:2
生产:3
消费:3
生产:4
消费:4
生产:5
消费:5
生产:6
消费:6
生产:7
消费:7
生产:8
消费:8
生产:9
消费:9
生产:10
消费:10
生产:11
消费:11
生产:12
消费:12
生产:13
消费:13
生产:14
消费:14
生产:15
消费:15
生产:16
消费:16
*/

最后修改:2019 年 05 月 01 日 04 : 30 AM

发表评论