第七章 多线程

本文介绍了单CPU环境下线程并发的原理,解释了为何调用start()而非run()方法来启动线程,并详细阐述了线程的生命周期包括创建、就绪、运行、阻塞和死亡等五种状态。最后,提供了两个线程输出1到5的示例代码,分别使用Thread类继承和Runnable接口实现的方式。此外,通过多线程模拟夫妻两人对同一账户的取款过程,考虑网络延迟因素,展示了多线程在实际场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、一个单CPU的机器,如何同时执行多个线程,请简述其原理

  • 单CPU中进程只能是并发,多CPU计算机中进程可以并行。
  • 单CPU单核中线程只能并发,单CPU多核中线程可以并行
  • 无论是并发还是并行,使用者来看,看到的是多进程,多线程。

2、调用线程对象的start()方法会执行run()方法,为什么不直接调用run()方法

  • 调用start()方法会执行run()方法并启动线程
  • 调用run()方法只会执行里面的代码 并不会启动线程

3.线程都生命周期包含几种状态,请描述每种状态的特征

  • 创建状态:在程序中用构造方法创建了以恶线程对象后,新的线程处于创建状态。此时,它已经获得了相应的资源,但还没有处于可运行的状态
  • 就绪状态:线程创建后,就可以通过调用start()方法启动线程。此时,线程将进入线程队列排列,等待CPU资源,这表明它已经具备了运行条件
  • 运行状态:当就绪状态的线程获得CPU资源时,即可转入运行状态。
  • 阻塞状态:一个正在运行的线程因为某种原因不能继续运行是,进入阻塞状态
  • 死亡状态:一个线程的run()方法运行完毕时,线程则进入死亡状态。处于死亡状态的线程不具有继续运行的能力

4.编写一个程序创建两个线程对象,每个线程输出1到5的数。要求线程类分别使用继承Thread类和实现Runnable接口两种方式创建

public class Test2 {
	public static void main(String[] args) {
        //创建线程对象
		Thread thread1 = new Thread(new Mythread2());		
		//启动线程
        thread1.start();
	}
}
//使用实现Runnable接口的方式创建线程
class Mythread2 implements Runnable{
	public void run(){
		for(int i=1;i<=5;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

public class Test {
	public static void main(String[] args) {
        //创建线程对象
		Mythread thread1 = new Mythread();		
		//启动线程
        thread1.start();
	}
}
//使用继承Thread类的方式创建线程
class Mythread extends Thread{
	public void run(){
		for(int i=1;i<=5;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

5.张三和他的妻子各拥有一张银行卡和存折,可以对同一个银行账户进行存取款操作,现银行账户余款为500元,每人各取5次,每次取款100元,在取款过程中存在网络延时。现使用多线程模拟这个过程。

//银行账户类
public class Account {
 private int balance=500;  		//余额
 public int getBalance() {
    return balance;
 }
 //取款
 public void withdraw(int amount) {
    balance=balance-amount;
 }
}
//取款的线程类
public class TestAccount implements Runnable {
	// 所有用TestAccount对象创建的线程共享同一个账户对象
	private Account acct = new Account();

	public void run() {
		for (int i = 0; i < 5; i++) {
			makeWithdrawal(100); // 取款
			if (acct.getBalance() < 0) {
				System.out.println("账户透支了!");
			}
		}
	}

	private synchronized void makeWithdrawal(int amt) {
		if (acct.getBalance() >= amt) {
			System.out.println(Thread.currentThread().getName() + " 准备取款");
			try {
				Thread.sleep(500); // 0.5秒后实现取款
			} catch (InterruptedException ex) {
			}
			// 如果余额足够,则取款
			acct.withdraw(amt);
			System.out.println(Thread.currentThread().getName() + " 完成取款");
		} else {
			// 余额不足给出提示
			System.out.println("余额不足以支付" + Thread.currentThread().getName()
					+ " 的取款,余额为 " + acct.getBalance());
		}
	}
}
public class TestWithdrawal {
	public static void main(String[] args) {
	       //创建两个线程000
	       TestAccount r=new TestAccount();
	       Thread one=new Thread(r);
	       Thread two=new Thread(r);
	       one.setName("张三");
	       two.setName("张三的妻子");
	       //启动线程
	       one.start();
	       two.start();
	   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值