JavaSE-多线程

目录

一、API

一、JoinDemo

二、RunDemo

 三、SleepDemo

四、StopDemo

五、ThreadApiDemo

六、 YieldDemo

二、producerAndConsumer

1.Consumer

2. Goods

3. Producer

4.Test 

三、producerAndConsumer

1.Consumer

2. Goods

3. Producer

4.Test 

四、producerAndConsumer

1.Consumer

2. Goods

3. Producer

4.Test 

五、producerAndConsumer

1.Consumer

2. Goods

3. Producer

4.Test 


一、API

一、JoinDemo

public class JoinDemo {
    public static void main(String[] args) {
        RunDemo runDemo=new RunDemo();
        Thread thread=new Thread(runDemo);
        thread.start();
        for (int i = 0; i <10 ; i++) {
            if (i==3){
                try {
                    thread.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName()+"-----"+i);
        }
    }
}

二、RunDemo

Runnable 的使用 必须对此进行重写
public class RunDemo implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
            System.out.println(Thread.currentThread().getName()+"----"+i);
        }
    }
}

 三、SleepDemo

睡眠规定的时间,让出cpu片资源
public class SleepDemo {
    public static void main(String[] args) {
        RunDemo runDemo=new RunDemo();
        Thread thread=new Thread(runDemo);
        thread.start();
        for (int i = 0; i <10 ; i++) {
            System.out.println(Thread.currentThread().getName()+"-----"+i);
            try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();

            }
        }
    }
}

四、StopDemo

较为粗暴  直接停止
public class StopDemo {
    public static void main(String[] args) {
        RunDemo runDemo=new RunDemo();
        Thread thread=new Thread(runDemo);
        thread.start();
        for (int i = 0; i <10 ; i++) {
           if (i==2){
               //让Thread停止
               thread.stop();
           }
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-----"+i);
        }
    }
}

五、ThreadApiDemo

public class ThreadApiDemo {
    public static void main(String[] args) {
        //获取当前线程的实例
        Thread thread=Thread.currentThread();
        //获取当前线程的名称
        System.out.println(thread.getName());
        //获取线程的优先级,一般情况优先级是0~10之间的整数,默认优先级是5,特殊情况下也可以是0~100之间的整数
        /*
        * 作用:
        * 数值月打代表优先级越高,但是优先级越高并不一定意味这它会被先执行,二是说优先级高的会执行的效率更大一些,仅此而已*/
        System.out.println();
    }
}

六、 YieldDemo

礼让cpu资源
public class YieldDemo {
    public static void main(String[] args) {
        RunDemo runDemo=new RunDemo();
        Thread thread=new Thread(runDemo);
        thread.start();
        for (int i = 0; i <10 ; i++) {
           if (i==6){
               //线程礼让一次,进入就绪状态,如果就绪队列中没有其他线程或者其他线程没有它自己抢占cpu资源快的话,那么它会快读的抢占CPU资源进行运行状态;
               Thread.yield();
           }
            System.out.println(Thread.currentThread().getName()+"-----"+i);
        }
    }
}

二、producerAndConsumer

1.Consumer

package com.tensent.class4.producerAndConsumer;

public class Consumer implements Runnable {
    private Goods goods;

    public Consumer(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
            System.out.println("消费者消费了========="+goods.getBrand()+"======="+goods.getName());
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

2. Goods

package com.tensent.class4.producerAndConsumer;
/*
* 生产者和消费这共存的资源:商品*/
public class Goods {
    private String brand;
    private String name;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3. Producer

public class Producer implements Runnable {
    private Goods goods;

    public Producer(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            //交替生产哇哈哈矿泉水和旺仔小馒头
            if (i % 2 == 0) {
                goods.setBrand("哇哈哈");
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                goods.setName("矿泉水");
            }else{
                goods.setBrand("旺仔");
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                goods.setName("小馒头");

            }
            System.out.println("生产者生产了----"+goods.getBrand()+"----"+goods.getName());
        }
    }
}

4.Test 

* 1.生产者未生产 ,消费者已消费
* 2.连续生产  连续消费
* 3.两个属性的名称不能正常对应
*
* 加锁!
* */
public class Test1 {
    public static void main(String[] args) {
        Goods goods=new Goods();
        Producer producer=new Producer(goods);
        Consumer consumer=new Consumer(goods);
        Thread thread=new Thread(producer);
        Thread thread1=new Thread(consumer);
        thread.start();
        thread1.start();

    }
}

三、producerAndConsumer

1.Consumer

public class Consumer implements Runnable {
    private Goods goods;

    public Consumer(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
            goods.get();
        }
    }
}

2. Goods

/*
* 生产者和消费这共存的资源:商品*/
public class Goods {
    private String brand;
    private String name;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
//生产商品的方法
    public synchronized void set(String brand,String name){
        this.setBrand(brand);
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.setName(name);
        System.out.println("生产者生产了----"+this.getBrand()+"----"+this.getName());

    }
    public synchronized void get(){
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("消费者消费了========="+this.getBrand()+"======="+this.getName());

    }
}

3. Producer

public class Producer implements Runnable {
    private Goods goods;

    public Producer(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            //交替生产哇哈哈矿泉水和旺仔小馒头
            if (i % 2 == 0) {
                goods.set("哇哈哈","矿泉水");
            }else{
                goods.set("旺仔","小馒头");
            }
        }
    }
}

4.Test 

/*
* 出现问题
* 1.生产者未生产 ,消费者已消费
* 2.连续生产  连续消费
* 3.两个属性的名称不能正常对应
*
* 加锁!  解决;3
* */
public class Test1 {
    public static void main(String[] args) {
        Goods goods=new Goods();
        Producer producer=new Producer(goods);
        Consumer consumer=new Consumer(goods);
        Thread thread=new Thread(producer);
        Thread thread1=new Thread(consumer);
        thread.start();
        thread1.start();

    }
}

四、producerAndConsumer

1.Consumer

public class Consumer implements Runnable {
    private Goods goods;

    public Consumer(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
goods.get();
        }
    }
}

2. Goods

/*
* 生产者和消费这共存的资源:商品*/
public class Goods {
    private String brand;
    private String name;
    private boolean isFull;
//定义一个标志位,表示共享区域中是否存在商品
    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
//生产商品的方法
    public synchronized void set(String brand,String name){
        /*
        * 如果生产者线程获取对应的cpu,得到了执行机会,此时先判断共享区域中是否存在商品,如果已经存在了,那么当前
        * 生产者线程进入阻塞状态,等待消费者来消费,反之如果共享区域中不存在商品,那么生产商品就可以了。*/
        if(isFull){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.setBrand(brand);
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.setName(name);
        System.out.println("生产者生产了----"+this.getBrand()+"----"+this.getName());
//如果程序能执行到此处,说明已经生产商品完毕了,此时需要标志位为ture
        isFull=true;
        //唤醒消费者来消费
        notify();
    }
    public synchronized void get(){
        /*
        * 如果消费者线程获取到对应的cpu时间片,获取到了执行机会了,此时先判断共享区域中是否存在商品,如果不存在
        * 商品,当前正在执行的消费者线程进入阻塞状态,等待生产者生产商品,反之如果已经存在商品,那么消费者直接消费就可以了*/
        if (!isFull){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("消费者消费了========="+this.getBrand()+"======="+this.getName());
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //如果程序运行到此处,说明消费者已经消费完毕,需要修改标志位为false
        isFull=false;
        //唤醒消费者前来生产
        notify();
    }
}

3. Producer


public class Producer implements Runnable {
    private Goods goods;

    public Producer(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            //交替生产哇哈哈矿泉水和旺仔小馒头
            if (i % 2 == 0) {
                goods.set("哇哈哈","矿泉水");
            }else{
                goods.set("旺仔","小馒头");
            }
        }
    }
}

4.Test 

public class Test1 {
    public static void main(String[] args) {
        Goods goods=new Goods();
        Producer producer=new Producer(goods);
        Consumer consumer=new Consumer(goods);
        Thread thread=new Thread(producer);
        Thread thread1=new Thread(consumer);
        thread.start();
        thread1.start();

    }
}

五、producerAndConsumer

1.Consumer


public class ConsumerQueue implements  Runnable {
    private BlockingQueue<Goods> blockingQueue;

    public ConsumerQueue(BlockingQueue<Goods> blockingQueue) {
        this.blockingQueue = blockingQueue;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            Goods goods=null;
            try {
                goods = blockingQueue.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("消费者消费了商品======="+goods.getBrand()+"======"+goods.getName());
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

2. Goods

public class Goods {
    private String brand;
    private String name;

    public Goods(String brand, String name) {
        this.brand = brand;
        this.name = name;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3. Producer


public class ProducerQueue implements Runnable {
   private BlockingQueue<Goods> blockingQueue;

    public ProducerQueue(BlockingQueue<Goods> blockingQueue) {
        this.blockingQueue = blockingQueue;
    }

    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
            Goods goods=null;
            if (i%2==0){
                goods=new Goods("哇哈哈","矿泉水");
            }else{
                goods=new Goods("旺仔","小馒头");
            }
            System.out.println("生产者生产了商品----"+goods.getBrand()+"----"+goods.getName());
        //把生产者生产的商品放入到队列中储存
            try {

                blockingQueue.put(goods);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

4.Test 

public class Test1 {
    public static void main(String[] args) {
        BlockingQueue<Goods>blockingQueue=new ArrayBlockingQueue<Goods>(5);
        ProducerQueue producerQueue=new ProducerQueue(blockingQueue);
        ConsumerQueue consumerQueue=new ConsumerQueue(blockingQueue);
        new Thread(producerQueue).start();
        new Thread(consumerQueue).start();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值