2022-11-29 线程

  • 匿名内部类实现线程创建
  • package com.lagou.task18;
    
    public class ThreadNonameTest extends Thread{
        public static void main(String[] args) {
            //匿名内部类的语法格式   父类/父类接口 变量名 = new 父类/父类接口{方法体};
            //1.使用继承+匿名内部类的方式创建并启动线程
            /*Thread t1 = new Thread(){
                @Override
                public void run() {
                    System.out.println("张三说:在吗?");
                }
            };
            t1.start();*/
            new Thread(){
                @Override
                public void run() {
                    System.out.println("张三说:在吗?");
                }
            }.start();
            //2.使用实现接口+匿名内部类的方式创建并启动线程
            /*Runnable rb = new Runnable() {
                @Override
                public void run() {
                    System.out.println("李四说: 不在。");
                }
            };
            Thread t2 = new Thread(rb);
            t2.start();*/
    
            /*new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("李四说: 不在。");
                }
            }).start();*/
            //java8开始支持lambda表达式:(形参列表) ->{方法体;}
            /*Runnable rb = () -> System.out.println("李四说:不在");
            new Thread(rb).start();*/
            new Thread(() -> System.out.println("李四说:不在")).start();
        }
    }
    
  • 线程的生命周期

  • 线程的编号和名称

  •  继承的方式获取主线程的id

  •   

常用的方法

  • //当子线程不是守护线程时,,虽然主线程先结束了,但是子线程依然会继续执行,直到打印完毕所有数据时。
    //当子线程时守护线程时,当主线程结束后,子线程会随之结束。
  • 线程同步机制

 

package com.lagou.task18;

public class AccountRunnableTest implements Runnable{
    private int balance ; //用于描述账余额
    private Demo dm = new Demo();
    public AccountRunnableTest() {
    }

    public AccountRunnableTest(int balance) {
        setBalance(balance);
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        if (balance >= 0) {
            this.balance = balance;
        }else
            System.out.println("请输入正确的账户");
    }

    @Override
    public void run() {
        System.out.println("线程" + Thread.currentThread().getName() + "已经启动");
        synchronized (dm) {
            //1.模拟从后台查询账户余额的过程
            int temp = getBalance();
            //2.模拟取款200元的过程
            if (temp>=200){
                System.out.println("正在出钞,请稍后。");
                temp -=200;
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("请取走你的钞票!");
            }else
                System.out.println("余额不足");
            //3.模拟将最新的账余额写入后台
            setBalance(temp);
        }
    }

    public static void main(String[] args) {
        AccountRunnableTest account = new AccountRunnableTest(1000);
        Thread t1 = new Thread(account);
        Thread t2 = new Thread(account);
        t1.start();
        t2.start();

        System.out.println("主线程开始等待:");
        try {
            t1.join();
           //t2.start(); //也就是等待线程一取款操作结束后在启动线程二
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("最终的账户余额为:" + account.getBalance());
    }
}
class Demo{
}

 

每个人都带着一把锁!要求必须是同一个对象

  同步代码块实现线程同步的方式二

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值