线程的补充(续)

文章讨论了如何在Java中合理地终止线程,推荐使用标志而非`stop`方法以避免数据丢失。此外,介绍了线程调度的抢占式和均分式模型,以及设置线程优先级、让位、合并线程的方法。线程安全是关键,特别是在多线程环境下的共享数据修改。解决线程安全问题通常采用同步机制,确保数据一致性。文章通过模拟银行账户取款操作展示了线程同步的重要性。
摘要由CSDN通过智能技术生成

一丶强制终止一个线程的执行?

见Test01,Stop方法不建议使用,易丢失数据。

public class Test01 {

//强制终止线程的进程测试
    public static void main(String[] args) {
        Thread t = new Thread(new MyThread());
        t.setName("t");
        t.start();
        try {
            Thread.sleep(1000 * 2);
        } catch (InterruptedException e) {
             e.printStackTrace();
        }
        //强行终止T线程
        //t.stop();//已经过时不建议使用
        //stop容易损失数据。
        //直接将进程杀死,线程未保存的数据将丢失不建议使用。
    }
}
class MyThread implements Runnable{
    @Override
    public void run() {
        for(int i = 0;i <= 10;i++){
            System.out.println(Thread.currentThread().getName() + "-----" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "-----end");
        }
    }
}

二丶合理的终止一个线程的执行?

见Test02,使用标记来控制线程的执行。例 boolean run = false;

public class Test02 {
    //怎么合理的终止一个线程的执行
    public static void main(String[] args) {
        MyThread02 t2 = new MyThread02();
        Thread t = new Thread(t2);
        t.setName("t");
        t.start();
        try {
            Thread.sleep(1000 * 5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.run = false;//标记一个判断条件,后面可以控制语句的进行
    }
}
class MyThread02 implements Runnable{
    boolean run = true;
    public void run(){
        for (int i = 0; i <= 10; i++) {
            if(run) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName() + "-----" + i);
            }
        }
        System.out.println(Thread.currentThread().getName() + "---------" + "end");
    }
}

三丶(了解)线程调度概述?

3.1.抢占式调度模型

3.2.均分式调度模型

四丶(了解)线程的调度方法?

void setPriority() 设置线程优先级

static void yield() 暂停当前执行的线程,运行其他线程,让位。

int getPriority() 获取当前线程的优先级

优先级较高的获取cpu时间片可能会多,只是大概率并不是完全。

void join() 合并线程,当前线程进入阻塞

五丶(了解)线程的优先级?

抢到的cpu时间片不是谁先谁后,而是优先级越高处于运行时间的状态多一些。

六丶线程的让位?

Thread.yield();静态方法,其作用会让给主线程运行

七丶线程合并?

实例方法join();需要进行级try catch的异常处理,当前线程与其他线程进行协调合并。

八丶线程的安全是重点?为什么这个是重点?

以后项目都是运行在服务器中,线程对象的创建运行都不需要我们进行编写。在多线程并发的环境下是否安全。

九丶线程不安全的条件?

一是多线程并发;二是有共享数据;三是共享数据有修改的行为

十丶怎么解决线程安全问题呢?

线程排队执行来这解决线程安全问题(不能并发),此机制被称为线程同步机制,用来解决线程安全问题。线程同步就是线程排队,会牺牲

一定效率,数据安全第一位,效率第二位,一切以安全为主。

十一丶同步和异步的理解?

异步(并发)编程模型:线程t1和t2各自执行各自的,互不相管,谁也不需要等谁,异步编程模型,多线程并发,效率较高

同步(排队)编程模型:线程t1和线程t2,在线程t1执行时必须等待t2结束,两个线程之间发生了等到关系,这就是同步编程模型,效率较低

,线程排队执行。异步就是并发,同步就是排序。

十二丶账户类的定义?

编写程序模拟两个线程同时对同一个账户进行取款操作。见test06。

十三丶模拟两个线程对同一个账户取款。

import sun.java2d.pipe.AAShapePipe;
//假设同学A和同学B同时对中国银行进行取款操作
public class Test06{
    public static void main(String[] args){
        Account account = new Account("中国银行",100000);//银行账户
        Thread t1 = new Thread(new AccountThread(account));//指向同一个账户
        Thread t2 = new Thread(new AccountThread(account));//指向同一个账户
        t1.setName("t1");
        t2.setName("t2");
        t1.start();
        t2.start();
    }
}
//两个线程必须共享同一个账户对象
class AccountThread implements Runnable {
    //一个账户
    private Account act;
    public AccountThread(Account act){
        this.act = act;
    }
    //run方法的执行表示取款操作
    public void run(){
        double money = 50000;//假设是需要取款这么多钱
        act.withdraw(money);
        System.out.println(Thread.currentThread().getName()+ "取款" + money +"成功,余额为:"+ act.getBalance());
    }
}
class Account{
    private String actno;//账户
    private double balance;//余额
    public Account(){//构造器
    }
    public Account(String actno,double balance){//有参构造器
        this.actno = actno;
        this.balance = balance;
    }
    public String getActno() {
        return actno;
    }
    public void setActno(String actno) {
        this.actno = actno;
    }
    public double getBalance() {
        return balance;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    //取款方法
    public void withdraw(double money){
        double before = this.getBalance();//取款之前的余额
        double after = before - money;//取款后的余额
        this.setBalance(after);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苏航航航

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

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

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

打赏作者

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

抵扣说明:

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

余额充值