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();
}
}