Java封神路之多线程(第二篇),从把握整体架构到具体演示,快速掌握多线程机制

目录

一、和线程调度有关的方法  

二、线程同步机制 

三、练习题  

四、死锁🔒

五、 守护线程和定时器

六、实现线程的第三种方式 ,实现Callable接口

七、Object类中的wait和notify方法 —生产者和消费者模式

一、和线程调度有关的方法  

1.void setPriority(int newPriority) 设置线程的优先级

2.int getPriority() 获取线程优先级

package com.java.javase.Thread;
public class ThreadTest08 {
    public static void main(String[] args) {
        Thread currentThread=Thread.currentThread();
        System.out.println(currentThread.getName()+"线程的默认优先级是:"+currentThread.getPriority());
        Thread t=new Thread(new MyThread8());
        t.setName("t");
        t.start();
    }
}
class MyThread8 implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程的默认优先级是:"+Thread.currentThread().getPriority());
    }
}

输出结果:

main线程的默认优先级是:5
t线程的默认优先级是:5

3.Thread.yield() 当前线程暂停一下 

package com.java.javase.Thread;
public class ThreadTest {
    public static void main(String[] args) {
        /**
         * 让位,让当前线程暂停,回到就绪状态,让给其他线程
         * 静态方法:Thread.yield();
         */
        Thread t=new Thread(new MyRunable());
        t.setName("t");
        t.start();
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"--->"+i);
        }
    }
}
class MyRunable implements Runnable{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            // 每10个让位一次
            if(i%10==0){
                Thread.yield(); // 当前线程暂停一下,让给主线程
            }
            System.out.println(Thread.currentThread().getName()+"--->"+i);
        }
    }
}

4.void join() 合并线程  

package com.java.javase.Thread;
public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("main begin");
        Thread t=new Thread(new MyRunable());
        t.setName("t");
        t.start();
        // 合并线程
        t.join(); // t合并到当前线程中,当前线程受到阻塞,t线程执行直到结束,栈之间进行了协调
        System.out.println("main over");
    }
}
class MyRunable implements Runnable{
    @Override
    public void run() {
        for(int i=0;i<5;i++){
            System.out.println(Thread.currentThread().getName()+"--->"+i);
        }
    }
}

 输出结果:

main begin
t--->0
t--->1
t--->2
t--->3
t--->4
main over

二、线程同步机制 

不使用线程同步机制下—模拟两个线程对同一个账户取款

账户类 

package com.java.javase.ThreadSafe;
/**
银行账户
 */
public class Account {
    private String no;
    private double balance;
    public Account() {
    }
    public Account(String no, double balance) {
        this.no = no;
        this.balance = balance;
    }
    public String getNo() {
        return no;
    }
    public void setNo(String no) {
        this.no = no;
    }
    public double getBalance() {
        return balance;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    // 提供一个取款的方法
    public void withDraw(double money){
        // 未使用线程同步机制
        // t1和t2并发这个方法(t1和t2是两个栈,两个栈操作堆中同一个对象)
         double before=this.getBalance();
         double after=before-money;
         this.setBalance(after);
    }
}

线程类

package com.java.javase.ThreadSafe;

public class AccountThread extends Thread {
    // 两个线程必须共享同一个账户对象
    private Account act;
    public AccountThread(Account act){
        this.act=act;
    }
    @Override
    public void run() {
        double money=5000;
        act.withDraw(money);
        System.out.println(Thread.currentThread().getName()+"对001账户取款成功 "+"剩余余额:"+act.getBalance()  );
    }
}

测试类

package com.java.javase.ThreadSafe;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馒头爱学Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值