Java多线程学习

一 、创建线程的两种方式

1. 继承Thread

package com.zte.ThreadTest;

public class SoldTicket extends Thread {
    static int tickets = 50;
    static Object ob = "aa";

    public SoldTicket(String name) {
        super(name);
    }

    @Override
    public void run() {
        while (tickets > 0) {
            synchronized (ob) {
                if (tickets > 0) {

                    System.out.println(Thread.currentThread().getName() + "卖出第 " + tickets + " 张票");
                    --tickets;
                } else {
                    System.out.println(super.getName() + "卖完了");
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    public static void main(String[] args) {
        SoldTicket t1 = new SoldTicket("窗口一");
        SoldTicket t2 = new SoldTicket("窗口二");
        SoldTicket t3 = new SoldTicket("窗口三");
        t1.start();
        t2.start();
        t3.start();
    }
}





console-----------------------------------
窗口一卖出第 50 张票
窗口一卖出第 49 张票
窗口一卖出第 48 张票
窗口一卖出第 47 张票
窗口一卖出第 46 张票
窗口一卖出第 45 张票
窗口一卖出第 44 张票
窗口一卖出第 43 张票
窗口一卖出第 42 张票
窗口一卖出第 41 张票
窗口一卖出第 40 张票
窗口一卖出第 39 张票
窗口一卖出第 38 张票
窗口一卖出第 37 张票
窗口一卖出第 36 张票
窗口一卖出第 35 张票
窗口一卖出第 34 张票
窗口一卖出第 33 张票
窗口一卖出第 32 张票
窗口一卖出第 31 张票
窗口一卖出第 30 张票
窗口一卖出第 29 张票
窗口一卖出第 28 张票
窗口一卖出第 27 张票
窗口一卖出第 26 张票
窗口一卖出第 25 张票
窗口一卖出第 24 张票
窗口一卖出第 23 张票
窗口一卖出第 22 张票
窗口一卖出第 21 张票
窗口一卖出第 20 张票
窗口一卖出第 19 张票
窗口一卖出第 18 张票
窗口一卖出第 17 张票
窗口一卖出第 16 张票
窗口一卖出第 15 张票
窗口一卖出第 14 张票
窗口一卖出第 13 张票
窗口一卖出第 12 张票
窗口一卖出第 11 张票
窗口一卖出第 10 张票
窗口一卖出第 9 张票
窗口一卖出第 8 张票
窗口一卖出第 7 张票
窗口一卖出第 6 张票
窗口一卖出第 5 张票
窗口一卖出第 4 张票
窗口一卖出第 3 张票
窗口一卖出第 2 张票
窗口一卖出第 1 张票
窗口三卖完了
窗口二卖完了

Process finished with exit code 0


2.继承Runable

package com.zte.ThreadTest;

public class SoldTicketImpl implements Runnable {
    static int tickets = 50;
    static Object ob = "aa";
    @Override
    public void run() {
        while (tickets > 0) {
            synchronized (ob) {
                if (tickets > 0) {
                    System.out.println(Thread.currentThread().getName() + "卖出第 " + tickets + " 张票");
                    tickets--;
                } else {
                    System.out.println(Thread.currentThread().getName() + "卖完了");
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        SoldTicketImpl t = new SoldTicketImpl();
        Thread t1 = new Thread(t,"窗口一");
        Thread t2 = new Thread(t,"窗口二");
        Thread t3 = new Thread(t,"窗口三");

        t1.start();
        t2.start();
        t3.start();

    }
}



console---------------------------------------
窗口一卖出第 50 张票
窗口一卖出第 49 张票
窗口一卖出第 48 张票
窗口一卖出第 47 张票
窗口一卖出第 46 张票
窗口一卖出第 45 张票
窗口一卖出第 44 张票
窗口一卖出第 43 张票
窗口一卖出第 42 张票
窗口一卖出第 41 张票
窗口一卖出第 40 张票
窗口一卖出第 39 张票
窗口一卖出第 38 张票
窗口一卖出第 37 张票
窗口一卖出第 36 张票
窗口一卖出第 35 张票
窗口一卖出第 34 张票
窗口一卖出第 33 张票
窗口一卖出第 32 张票
窗口一卖出第 31 张票
窗口一卖出第 30 张票
窗口一卖出第 29 张票
窗口一卖出第 28 张票
窗口一卖出第 27 张票
窗口一卖出第 26 张票
窗口一卖出第 25 张票
窗口一卖出第 24 张票
窗口一卖出第 23 张票
窗口一卖出第 22 张票
窗口一卖出第 21 张票
窗口一卖出第 20 张票
窗口一卖出第 19 张票
窗口一卖出第 18 张票
窗口一卖出第 17 张票
窗口一卖出第 16 张票
窗口一卖出第 15 张票
窗口一卖出第 14 张票
窗口一卖出第 13 张票
窗口一卖出第 12 张票
窗口一卖出第 11 张票
窗口一卖出第 10 张票
窗口一卖出第 9 张票
窗口一卖出第 8 张票
窗口一卖出第 7 张票
窗口一卖出第 6 张票
窗口一卖出第 5 张票
窗口一卖出第 4 张票
窗口一卖出第 3 张票
窗口一卖出第 2 张票
窗口一卖出第 1 张票
窗口三卖完了
窗口二卖完了

Process finished with exit code 0

二 、对象锁

1.同步代码块

package com.zte.ThreadTest;

public class DisapperRequest implements Runnable {

    static DisapperRequest dp = new DisapperRequest();
    static int i = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(dp);
        Thread t2 = new Thread(dp);
        t1.start();
        t2.start();

        while(t1.isAlive()||t2.isAlive()){

        }
        System.out.println(i);

    }

    @Override
    public void run() {
        synchronized (this) {
            System.out.println("我是" + Thread.currentThread().getName() + "开始");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "结束");
        }

    }
}


我是Thread-0开始
Thread-0结束
我是Thread-1开始
Thread-1结束
0


2.同步方法

package com.zte.ThreadTest;

public class DisapperRequest implements Runnable {
    static DisapperRequest dp = new DisapperRequest();

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(dp);
        Thread t2 = new Thread(dp);
        t1.start();
        t2.start();

        while(t1.isAlive()||t2.isAlive()){

        }

    }

    @Override
    public void run() {
        method();
    }

    public synchronized void method(){
        System.out.println("我是" + Thread.currentThread().getName() + "开始");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "结束");
    }
}




我是Thread-0开始
Thread-0结束
我是Thread-1开始
Thread-1结束

二、类锁

1.静态方法类锁

package com.zte.ThreadTest;

public class DisapperRequest implements Runnable {
    static DisapperRequest dp1= new DisapperRequest();
    static DisapperRequest dp2= new DisapperRequest();


    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(dp1);
        Thread t2 = new Thread(dp2);
        t1.start();
        t2.start();

        while(t1.isAlive()||t2.isAlive()){

        }

    }

    @Override
    public void run() {
        method();
    }

    public static synchronized void method(){
        System.out.println("我是" + Thread.currentThread().getName() + "开始");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "结束");
    }
}


我是Thread-0开始
Thread-0结束
我是Thread-1开始
Thread-1结束



2.(.class 类锁)

package com.zte.ThreadTest;

public class DisapperRequest implements Runnable {
    static DisapperRequest dp1= new DisapperRequest();
    static DisapperRequest dp2= new DisapperRequest();


    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(dp1);
        Thread t2 = new Thread(dp2);
        t1.start();
        t2.start();

        t1.join();
        t2.join();

    }

    @Override
    public void run() {
        method();
    }

    public  void method(){
        synchronized(DisapperRequest.class){
            System.out.println("我是" + Thread.currentThread().getName() + "开始");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "结束");
        }

    }
}

我是Thread-0开始
Thread-0结束
我是Thread-1开始
Thread-1结束

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值