多线程编程

一: 两种实现方式:

1.继承Thread类重写run方法
2.继承Runnable接口重写run方法(通常用这种,java单继承的局限性,后期还想继承其他类会无从下手)

二:简单demo1(多线程模拟买票)

package 多线程;

public class BuyTicket {
    public static void main(String[] args) {
        TickThread tt = new TickThread();
        Thread t1 = new Thread(tt,"张三");
        Thread t2 = new Thread(tt,"李四");
        Thread t3 = new Thread(tt,"王五");
        t1.start();
        t2.start();
        t3.start();
    }
}
class TickThread implements Runnable{
    private  int total = 10;
    @Override
    public void run() {
        while (total>=1) {
            total--;
            System.out.println(Thread.currentThread().getName() + "买了票,剩余" + total + "张");
        }
        System.out.println(Thread.currentThread().getName()+"发现售罄");
    }
}

多线程编程_第1张图片
由于资源没有加锁,导致数据异常问题

三 简单demo2(模拟龟兔赛跑)

package 多线程;

public class RunGame {
    public static void main(String[] args) {
        Runner rn = new Runner();
        Thread rabbit = new Thread(rn,"rabbit");
        Thread tortoise = new Thread(rn,"tortoise");
        rabbit.start();
        tortoise.start();

    }
}
class Runner implements Runnable{
    private int stage = 100;
    private String winner=null;
    @Override
    public void run() {
       for(int i=1;i<=100;i++){
           if(isOver(i)==true) {
               Thread.currentThread().interrupt();
               break;
           }

       }

    }
    boolean isOver(int step){
        if (winner!=null){
            return true;
        }else{
            if(step==100){
                System.out.println(Thread.currentThread().getName()+"胜利!");
                winner=Thread.currentThread().getName();
                return true;
            }else{
                System.out.println(Thread.currentThread().getName()+"->"+step);
                return false;
            }
        }
    }
}

多线程编程_第2张图片

三:线程五大状态:

1.新生

Thread rabbit = new Thread(rn,"rabbit");
Thread tortoise = new Thread(rn,"tortoise");

new 一个Thread后,将会分配线程所需的资源。

2.就绪

t.start();

调用start后,线程进入就绪等待队列,至于什么时候运行,CPU调度说的算。

3.运行

4.阻塞

wait() 不携带资源
sleep()携带资源

5.死亡

#run正常执行完毕,尽量不要调用stop去强行终止线程

四:join简单使用demo

 Thread worker1 = new Thread(()->{
            try {
                for(int i=0;i<5;i++){
                    Thread.sleep(1000);
                    System.out.println("睡了"+(i+1)+"秒");
                }

                System.out.println("睡了一会,工作完成了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        },"worker1");
        Thread worker2 = new Thread(()->{
            try {
                worker1.join();
                System.out.println("员工2开始工作");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        },"worker2");

        worker1.start();
        worker2.start();

多线程编程_第3张图片

五:yield与设置优先级

yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
设置优先级只是具有较大的概率先执行,但不代表一定先执行。

你可能感兴趣的:(多线程编程)