线程和

代码1

public class Demo7 {
    /*
    创建线程
    第一种:
    1.创建一个类继承Thread类
    2.重写run()方法,创建多线程做的事情
    3.启动线程
        创建线程对象 RabbitThread rabbitThread = new RabbitThread();
        使用线程对象调用start完成启动
    */

    public static void main(String[] args) {
        RabbitThread rabbitThread = new RabbitThread();
//        rabbitThread.run();
        rabbitThread.setName("小兔子");
        rabbitThread.start();
        Thread.currentThread().setName("小乌龟");
        while(true){
            System.out.println(Thread.currentThread().getName()+"乌龟跑");
        }
    }
}

class RabbitThread extends Thread{
    @Override
    public void run() {
        while (true){
              System.out.println(Thread.currentThread().getName()+"兔子跑");
//            System.out.println("兔子跑");
        }
    }
}

代码2

/*
第二种:使用实现的方式创建多线程
1.创建一个类型实现Runnabe接口
2.重写run方法
3.创建Runnable对象
4.创建Thread对象,将Runnable对象作为参数进行传递
5.调用start()方法启动线程

继承的方式实现的方式对比
1.继承的方法简单
2.实现的方式可以更好的实现资源共享
*/
public class RabbitRunnable implements Runnable {

    public static void main(String[] args) {
        //1.创建Runnable对象
        RabbitRunnable rabbitRunnable = new RabbitRunnable();
        //2.创建Thread类将Runnable对象作为参数进行传递
        Thread t1 = new Thread(rabbitRunnable);
        t1.start();

        Bird b1 = new Bird();
        b1.start();

    }

    @Override
    public void run() {
        while (true){
            System.out.println("兔子跑-------");
        }
    }
}

class Bird extends Thread{
    @Override
    public void run() {
        while (true){
            System.out.println("小鸟飞----");
        }
    }
}

代码3

package com.atguigu.day14;

public class ThreadTest {
    public static void main(String[] args) {
//        RabbitThreadTest rabbit2 = new RabbitThreadTest("灰兔子");
//        rabbit2.setName("灰又灰的兔子");
//        RabbitThreadTest rabbit3 = new RabbitThreadTest("白兔子");
//
//        rabbit2.start();
//        rabbit3.start();
        BirdTest bird1 = new BirdTest();
        Thread t2 = new Thread(bird1);
        t2.setName("小红鸟");
        t2.start();
        Thread t3 = new Thread(bird1,"小灰鸟");
        t3.start();
    }
}


class RabbitThreadTest extends Thread{
    public RabbitThreadTest(String name) {
        super(name);
    }

    @Override
    public void run() {
        while (true){
            System.out.println(Thread.currentThread().getName()+"----running");
        }
    }
}

class BirdTest implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i <200 ; i++) {
            System.out.println(Thread.currentThread().getName()+"-----flying");
        }
    }
}

代码4

package com.atguigu.day14;
/*
public final boolean isAlive();测试线程是否处于活动状态,如果线程已经启动尚未终止,则为活动状态
public final int getPriority();返回线程优先级
public final void setPriority(int newPriority);改变线程优先级
*/
public class Demo8 {
    /*
    此时有三条线程
    1.主线程
    2.小白鸟线程
    3.小灰鸟线程
       isAlive();判断当前线程是否处于活动状态
       setPriority(优先级):
       1<=优先级<=10  如果没有指定优先级,默认的优先级是5
       优先级特别低,也会有执行的机会,先去执行优先级高的,再去执行优先级低的
    4.Thread.sleep(数字):让当前线程睡眠一段时间,单位是ms
    5.join()  强行插队,插队的线程调用join(),那么被插队的线程要进行等待,等插队的线程执行完毕后,才能继续执行
      join(2000)  强行插队,插队的线程调用join(xxx);,那么被插队的线程要进行等待xxx毫秒,等插队的线程执行完毕后或时间到了,才能继续执行
    */
    public static void main(String[] args) throws InterruptedException {
        BirdTtests birdTtests1 = new BirdTtests();
        Thread thread3 = new Thread(birdTtests1,"小白鸟");
        thread3.start();
        for (int i = 0; i <20 ; i++) {
            if (i==10){
//                thread3.join();
                thread3.join(2000);
            }
            System.out.println("主线程跑\t"+i);
        }

    }
}

class BirdTtests implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+"--fly--"+i);
        }
    }
}

输出

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=5135:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo8
主线程跑    0
主线程跑    1
主线程跑    2
主线程跑    3
主线程跑    4
主线程跑    5
主线程跑    6
主线程跑    7
主线程跑    8
主线程跑    9
小白鸟--fly--0
小白鸟--fly--1
小白鸟--fly--2
小白鸟--fly--3
小白鸟--fly--4
小白鸟--fly--5
小白鸟--fly--6
小白鸟--fly--7
小白鸟--fly--8
小白鸟--fly--9
小白鸟--fly--10
小白鸟--fly--11
小白鸟--fly--12
小白鸟--fly--13
小白鸟--fly--14
小白鸟--fly--15
小白鸟--fly--16
小白鸟--fly--17
小白鸟--fly--18
小白鸟--fly--19
主线程跑    10
主线程跑    11
主线程跑    12
主线程跑    13
主线程跑    14
主线程跑    15
主线程跑    16
主线程跑    17
主线程跑    18
主线程跑    19

Process finished with exit code 0

 代码5:

import java.util.Arrays;

public class Demo9 {
    public static void main(String[] args) {
        int[] arr1 = {1,20,33};
        int[] arr2 = new int[3];
        System.arraycopy(arr1,0,arr2,1,2);
        System.out.println(Arrays.toString(arr2));
    }
}

输出
[0, 1, 20]

代码6

import java.util.Scanner;

public class Demo10 {


    public static void main(String[] args) {
        Runner runTests=new Runner();
        Thread threadTests = new Thread(runTests,"线程");
        for (int i = 0; i < 10; i++) {
            if (i==5){
                threadTests.run();
            }
            System.out.println(Thread.currentThread().getName()+"--"+i);
        }
    }
}


class Runner implements Runnable{
    Scanner sc = new Scanner(System.in);
    @Override
    public void run() {
        while (true){
            System.out.println(Thread.currentThread().getName()+"run 是否结束?");
            String s1 = sc.next();
            if (s1.equals("y")||s1.equals("Y")){
                break;
            }
        }
    }
}

输出

main--0
main--1
main--2
main--3
main--4
mainrun 是否结束?
n
mainrun 是否结束?
n
mainrun 是否结束?
y
main--5
main--6
main--7
main--8
main--9

代码7

package com.atguigu.day14;
//yield:线程的礼让,将线程从运行状态改为就绪状态
//Thread.yield( )线程让步,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行。
public class Demo11 {
    public static void main(String[] args) {
        YieldTest y1= new YieldTest("lin1");
        YieldTest y2 = new YieldTest("lin2");
        y1.start();
        y2.start();
    }
}

class YieldTest extends Thread{
    public YieldTest(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i <50 ; i++) {
            System.out.println(this.getName()+"--"+i);
            if (i==30){
                this.yield();
            }
        }
    }
}

输出

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=10886:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo11
lin1--0
lin1--1
lin1--2
lin2--0
lin1--3
lin1--4
lin1--5
lin1--6
lin1--7
lin1--8
lin1--9
lin1--10
lin1--11
lin1--12
lin1--13
lin1--14
lin1--15
lin1--16
lin1--17
lin1--18
lin1--19
lin1--20
lin1--21
lin1--22
lin1--23
lin1--24
lin1--25
lin1--26
lin1--27
lin1--28
lin1--29
lin1--30
lin2--1
lin2--2
lin2--3
lin2--4
lin2--5
lin2--6
lin2--7
lin2--8
lin2--9
lin2--10
lin2--11
lin2--12
lin2--13
lin2--14
lin2--15
lin2--16
lin2--17
lin2--18
lin2--19
lin2--20
lin2--21
lin2--22
lin2--23
lin2--24
lin2--25
lin2--26
lin2--27
lin2--28
lin2--29
lin2--30
lin2--31
lin2--32
lin2--33
lin2--34
lin2--35
lin2--36
lin2--37
lin2--38
lin2--39
lin2--40
lin2--41
lin2--42
lin2--43
lin2--44
lin2--45
lin2--46
lin2--47
lin2--48
lin2--49
lin1--31
lin1--32
lin1--33
lin1--34
lin1--35
lin1--36
lin1--37
lin1--38
lin1--39
lin1--40
lin1--41
lin1--42
lin1--43
lin1--44
lin1--45
lin1--46
lin1--47
lin1--48
lin1--49

Process finished with exit code 0
lin1执行到30的时候,让lin2先执行

代码8

package com.atguigu.day14;
/*
调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
调用 stop() 方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题
*/
public class Demo12 {
    public static void main(String[] args) {
        Cat cat1 = new Cat("lin1");
        cat1.start();
        for (int i = 0; i < 30; i++) {
            if (i==15){
                Thread.yield();
            }
            System.out.println("主线程"+i+"run");
        }

    }
}

class Cat extends Thread{
    public Cat(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i <50 ; i++) {
            if (i==20){
                this.stop();
            }
            System.out.println(this.getName()+"--run"+i);
        }
    }
}

输出

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=2769:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo12
主线程0run
主线程1run
主线程2run
主线程3run
主线程4run
主线程5run
主线程6run
主线程7run
主线程8run
主线程9run
主线程10run
主线程11run
主线程12run
主线程13run
主线程14run
lin1--run0
lin1--run1
lin1--run2
lin1--run3
lin1--run4
lin1--run5
lin1--run6
lin1--run7
lin1--run8
lin1--run9
lin1--run10
lin1--run11
lin1--run12
lin1--run13
lin1--run14
lin1--run15
lin1--run16
lin1--run17
lin1--run18
lin1--run19  //此时run方法结束
主线程15run
主线程16run
主线程17run
主线程18run
主线程19run
主线程20run
主线程21run
主线程22run
主线程23run
主线程24run
主线程25run
主线程26run
主线程27run
主线程28run
主线程29run

Process finished with exit code 0

代码9

package com.atguigu.day14;
/*
守护线程
t1.setDaemon(true) 哪个线程调用了setDaemon(true),则此线程就是一个守护线程
设置守护线程后,主线程结束后,run方法的运行也随之结束
*/
public class Demo13 {
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        Thread threadDog = new Thread(dog1,"lin1");
        threadDog.setDaemon(true);//此方法必须在start方法前面
        threadDog.start();
        for (int i = 0; i < 30; i++) {
            System.out.println("做正经事"+i);
        }
    }
}


class Dog implements Runnable{

    @Override
    public void run() {
        while (true){
            System.out.println("音乐播放中---------");
        }
    }
}

代码10

package com.atguigu.day14;
/*
线程安全问题:当多个线程操作共享数据时,有可能会发生线程安全的问题
解决线程安全的问题
1.同步代码块
2.同步方法
注意:局部变量不能作为共享资源
同步监视器对象:
1.必须是引用数据类型
2.当多条线程操作共享数据,同步监视器对象必须是同一个
3.同步代码的意义
win1 win2 win3都被CPU调度,都要执行run方法,发现有同步代码块,如果win1进入同步代码块,win2和win3只能在同步代码块外等待win1卖完最后一张票后再进入同步代码块
保证在同步代码块内只有一个线程在执行,其他线程需要在同步代码块外等待
*/

//同步代码块的方式
public class Demo15 { public static void main(String[] args) { WinThread win1 = new WinThread("win1"); WinThread win2 = new WinThread("win2"); WinThread win3 = new WinThread("win3"); win1.start(); win2.start(); win3.start(); } } class WinThread extends Thread{ static int count=60; public WinThread(String name) { super(name); } @Override public void run() { while (true){ synchronized (WinThread.class){ if (count>0){ System.out.println(this.getName()+"卖了第"+count+"张票"); count--; }else if(count==0){ break; } } } } }

输出结果为三个窗口合作卖票

代码11

package com.atguigu.day14;

public class Demo16 {
    public static void main(String[] args) {
        SaleTicket sale = new SaleTicket();
        Thread win1 = new Thread(sale,"win1");
        Thread win2 = new Thread(sale,"win2");
        Thread win3 = new Thread(sale,"win3");
        win1.start();
        win2.start();
        win3.start();
    }
}

class SaleTicket implements Runnable {
    int count = 50;

    @Override
    public void run() {
        while (true) {
            synchronized ("") {
                if (count > 0) {
                    System.out.println(Thread.currentThread().getName() + "卖了第" + count + "张票");
                    count--;
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else if (count == 0) {
                    break;
                }
            }
        }
    }
}

输出结果

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=8561:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo16
win2卖了第50张票
win2卖了第49张票
win2卖了第48张票
win2卖了第47张票
win2卖了第46张票
win2卖了第45张票
win2卖了第44张票
win2卖了第43张票
win2卖了第42张票
win2卖了第41张票
win2卖了第40张票
win2卖了第39张票
win3卖了第38张票
win3卖了第37张票
win3卖了第36张票
win3卖了第35张票
win3卖了第34张票
win3卖了第33张票
win3卖了第32张票
win1卖了第31张票
win1卖了第30张票
win3卖了第29张票
win3卖了第28张票
win3卖了第27张票
win3卖了第26张票
win3卖了第25张票
win3卖了第24张票
win3卖了第23张票
win2卖了第22张票
win2卖了第21张票
win3卖了第20张票
win1卖了第19张票
win1卖了第18张票
win1卖了第17张票
win1卖了第16张票
win1卖了第15张票
win1卖了第14张票
win1卖了第13张票
win1卖了第12张票
win1卖了第11张票
win1卖了第10张票
win1卖了第9张票
win1卖了第8张票
win3卖了第7张票
win2卖了第6张票
win2卖了第5张票
win2卖了第4张票
win2卖了第3张票
win2卖了第2张票
win3卖了第1张票

Process finished with exit code 0

代码12:

 实现的方式

使用同步方法完成资源共享
同步方法同步监视器对象是this
当有一条线程进入同步方法,那么其他线程不仅不能进入此方法,也不能进入拥有同一个同步监视器对象的同步方法
package com.atguigu.day14;

public class Demo17 {
    public static void main(String[] args) {
        Tickets tickets = new Tickets();
        Thread wins1 = new Thread(tickets,"wins1");
        Thread wins2 = new Thread(tickets,"wins2");
        Thread wins3 = new Thread(tickets,"wins3");
        wins1.start();
        wins2.start();
        wins3.start();
    }
}

class Tickets implements Runnable{
    int count=50;

    @Override
    public void run() {
        while (true){
            if (count<=0){
                break;
            }
            sales();
        }
    }

    private synchronized void sales(){
        if (count<0){
            return;
        }
        System.out.println(Thread.currentThread().getName()+"卖了第"+count+"张票");
        count--;
        try{
            Thread.sleep(100);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

输出结果

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=2065:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo17
wins1卖了第50张票
wins1卖了第49张票
wins3卖了第48张票
wins2卖了第47张票
wins2卖了第46张票
wins2卖了第45张票
wins2卖了第44张票
wins3卖了第43张票
wins1卖了第42张票
wins1卖了第41张票
wins1卖了第40张票
wins3卖了第39张票
wins3卖了第38张票
wins2卖了第37张票
wins2卖了第36张票
wins2卖了第35张票
wins2卖了第34张票
wins2卖了第33张票
wins2卖了第32张票
wins2卖了第31张票
wins2卖了第30张票
wins3卖了第29张票
wins3卖了第28张票
wins3卖了第27张票
wins3卖了第26张票
wins3卖了第25张票
wins3卖了第24张票
wins3卖了第23张票
wins3卖了第22张票
wins3卖了第21张票
wins3卖了第20张票
wins3卖了第19张票
wins3卖了第18张票
wins3卖了第17张票
wins3卖了第16张票
wins3卖了第15张票
wins1卖了第14张票
wins1卖了第13张票
wins1卖了第12张票
wins1卖了第11张票
wins1卖了第10张票
wins1卖了第9张票
wins1卖了第8张票
wins1卖了第7张票
wins1卖了第6张票
wins1卖了第5张票
wins3卖了第4张票
wins2卖了第3张票
wins2卖了第2张票
wins3卖了第1张票
wins1卖了第0张票

Process finished with exit code 0

代码13

取款案例

public class Demo18 {
    public static void main(String[] args) {
        AccountRunnable acc1 = new AccountRunnable();
        Thread th1 = new Thread(acc1,"lin1");
        Thread th2 = new Thread(acc1,"lin2");
        th1.start();
        th2.start();
    }
}

class Account{
    int balance=600;
    public void withDraw(int money){
        balance-=money;
    }
}

class AccountRunnable implements Runnable{
    Account account= new Account();
    @Override
    public void run() {
        synchronized (account){
            if (account.balance>500){
                account.withDraw(500);
                System.out.println(Thread.currentThread().getName()+"取款陈宫,余额是"+account.balance);
            }else{
                System.out.println(Thread.currentThread().getName()+"余额不足");
            }
        }
    }
}

代码14

package com.atguigu.day14;
/*
线程通信
1.wait():进行等待
2.wait(时间)
3.notify:通知,如果有多个线程等待,则随机通知一个线程
4.notifyAll():通知所有等待的线程起来干活

* */
public class Demo19 {
    public static void main(String[] args) {
        Bar bar = new Bar();
        WaiterThread waiters = new WaiterThread();
        waiters.setBar(bar);
        CookThread cookers = new CookThread("lin2",bar);
        waiters.setName("lin1");
        waiters.start();
        cookers.start();


    }
}

class WaiterThread extends Thread{
    private Bar bar;

    public void setBar(Bar bar) {
        this.bar = bar;
    }

    @Override
    public void run() {
        while (true){
            synchronized (bar){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if (bar.count<0){
                    try {
                        bar.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                bar.count--;
                System.out.println(this.getName()+"端走了一份菜,还剩"+bar.count+"份");
                bar.notify();
            }
        }
    }
}
class CookThread extends Thread{
    private Bar bar;

    public CookThread(String name, Bar bar) {
        super(name);
        this.bar = bar;
    }

    @Override
    public void run() {
        while (true){
            synchronized (bar){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (bar.count>=Bar.MAX_NUM){
                    try {
                        bar.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                bar.count++;
                System.out.println(this.getName()+"做了第"+bar.count+"道菜");
                bar.notify();
            }
        }
    }
}
class Bar {
    //只能放10份菜
    public static final int MAX_NUM=10;
    //记录吧台上菜的数量
    int count;
}

输出

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=4333:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo19
lin2做了第1道菜
lin2做了第2道菜
lin2做了第3道菜
lin2做了第4道菜
lin2做了第5道菜
lin2做了第6道菜
lin2做了第7道菜
lin1端走了一份菜,还剩6份
lin1端走了一份菜,还剩5份
lin2做了第6道菜
lin2做了第7道菜
lin2做了第8道菜
lin2做了第9道菜
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin1端走了一份菜,还剩8份
lin1端走了一份菜,还剩7份
lin2做了第8道菜
lin2做了第9道菜
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin1端走了一份菜,还剩8份
lin2做了第9道菜
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin1端走了一份菜,还剩8份
lin2做了第9道菜
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin1端走了一份菜,还剩8份
lin2做了第9道菜
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin1端走了一份菜,还剩8份
lin2做了第9道菜
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin1端走了一份菜,还剩8份
lin2做了第9道菜
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin1端走了一份菜,还剩8份
lin1端走了一份菜,还剩7份
lin2做了第8道菜
lin2做了第9道菜
lin2做了第10道菜
lin1端走了一份菜,还剩9份
lin1端走了一份菜,还剩8份
lin2做了第9道菜

Process finished with exit code -1

代码15死锁

package com.atguigu.day14;

public class Demo20 {
    public static void main(String[] args) {
        Object goods= new Object();
        Object money= new Object();
        GoodsThread gooder = new GoodsThread(goods,money);
        CustomerThread customer=new CustomerThread(goods,money);
        gooder.start();
        customer.start();
    }
}


class GoodsThread extends Thread{
    Object goods;
    Object money;

    public GoodsThread(Object goods, Object money) {
        this.goods = goods;
        this.money = money;
    }

    @Override
    public void run() {
        synchronized (money){
            System.out.println("先给钱");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (goods){
                System.out.println("后发货");
            }
        }
    }
}


class CustomerThread extends Thread{
    Object goods;
    Object money;

    public CustomerThread(Object goods, Object money) {
        this.goods = goods;
        this.money = money;
    }

    @Override
    public void run() {
        synchronized (goods){
            System.out.println("先发货");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (money){
                System.out.println("后给钱");
            }
        }
    }
}

代码16

//用同步方法的方式

public class Demo21 {
    public static void main(String[] args) {
        BarTest barTest = new BarTest();

        Cooker cooker = new Cooker(barTest);
        Thread t1 = new Thread(cooker,"鲁菜大厨");
        Thread t3 = new Thread(cooker,"粤菜大厨");

        Waiter waiter = new Waiter(barTest);
        Thread t2 = new Thread(waiter,"翠花");
        Thread t4 = new Thread(waiter,"小芳");
        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }
}

class Cooker implements Runnable{

    private BarTest barTest;

    public Cooker(BarTest barTest) {
        this.barTest = barTest;
    }

    @Override
    public void run() {
        while (true){
            barTest.put();
        }
    }
}

class Waiter implements Runnable{
    private BarTest barTest;

    public Waiter(BarTest barTest) {
        this.barTest = barTest;
    }

    @Override
    public void run() {
        while (true){
            barTest.get();
        }
    }
}

class BarTest{
    public static final int MAX_NUM=10;
    int num;

    public synchronized void put(){
        while (num>=MAX_NUM){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        num++;
        System.out.println(Thread.currentThread().getName()+"做了一道菜,现在有"+num+"道菜");
        //this.notify();
        this.notifyAll();
    }

    public synchronized void get(){
        while (num<=0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        num--;
        System.out.println(Thread.currentThread().getName()+"端走了一道菜,还剩"+num+"道菜");
        //this.notify();
        this.notifyAll();
    }
}

代码17

原文地址:https://www.cnblogs.com/hbxZJ/p/15706106.html