【多线程】- 常见面试题总结

线程和进程的区别?

  • 线程是进程的一个执行流,一个进程中可以包含多个线程。
  • 当系统运行时,系统就会自动的分配内存,这时就创建了进程。
  • 进程是程序运行的最小单元,线程是进程中的最小单元。

java中有几种方法来实现线程?

  • 两种。
  • 第一种是继承Theard类,重写run()方法,然后创建Theard类,调用start()方法来启动线程。
  • 第二种是实现Runnable接口,重写run()方法,然后创建线程的引用,创建Theard类的带引用参数的构造创建线程对象,调用start方法启动线程。

同步和异步的区别?

  • 同步:发送一个请求,等待系统返回后才能发送下一个请求,中间有个等待时间。
  • 异步:程序不用等待其他请求的返回,随时都可以发送请求。
  • 区别:同步的效率低,但是安全性高;异步的效率高,但是安全性低。

什么情况下使用同步、什么情况下使用异步?

  • 一般我们写程序时默认使用异步,因为效率高;
  • 但是,当出现多个线程处理共享数据,为了避免一个线程处理的时,另一个线程也来处理这个共享数据,造成脏数据的情况,就使用同步的方法,同步就会限制一次只能一个线程来处理,保证共享数据的安全性。

如何实现同步?

  • 同步的关键字synchronized;
  • 可以使用同步代码块;synchronized关键字,括号锁对象。
  • 也可以使用同步方法:在方法权限修饰符后面添加关键字synchronized;

线程都有什么状态?以及状态之间的关系?

  • 五种状态:创建、运行、冻结、临时阻塞、消亡。
    在这里插入图片描述

sleep()和wait()的区别(重要)?

  • 主要区别:
  • sleep()不会释放锁对象,其他线程无法进入同步锁。
  • wait()方法会释放所对象,当前线程进入线程池,等待其他线程调用notify方法唤醒线程。
  • 次要的区别:
  1. sleep()方法必须设置等待时间。wait方法可以设置也可以不设置。
  2. sleep()时间到线程就处于临时阻塞或者运行,wait没有时间的话,必须要等到notify或者notifyAll来唤醒。
  3. sleep不一定要定义在同步方法中。wait必须要定义到同步方法中。

线程如何停止?

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
  2. 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。
  3. 使用interrupt方法中断线程。

编写一个死锁程序。

package com.aaa.test;
/**
 * 死锁的编写:
 * 	1.创建一个类实现Runnable接口,重写run方法。
 * 	2.定义一个boolean变量,来当作参数编写当前类的构造方法。
 * 	3.创建一个类,里面的2个静态变量来当作两个锁对象。
 * 	4.实现run方法中锁对象的互相嵌套。通过if方法来区分true或者false。
 * 	5.创建两个线程的引用。--通过构造方法,一个传true,一个传false。
 * 	6.创建线程,调用start方法。
 * 总结:
 * 	共三个类,第一个主类执行main方法;第二个类是线程类;第三个类是创建锁。
 * @author admin
 *
 */


class Test implements Runnable{
	
	private boolean bo;//私有变量
	//构造方法,用于主方法创建线程的传参
	public Test(boolean bo) {
		this.bo = bo;
	}
	/**
	 * 重写run方法
	 */
	@Override
	public void run() {
		if (bo) {
			synchronized (Dome.OBJA) {
				System.out.println(Thread.currentThread().getName()+"我是a的if----------------");
				synchronized (Dome.OBJB) {
					System.out.println(Thread.currentThread().getName()+"我是b的if----------------");
				}
			}
		} else {
			synchronized (Dome.OBJB) {
				System.out.println(Thread.currentThread().getName()+"我是b的else");
				synchronized (Dome.OBJA) {
					System.out.println(Thread.currentThread().getName()+"我是a的else");
				}
			}
		}
	}
}
//用于创建锁对象
class Dome{
	public static final Object OBJA = new Object();//静态的通过类名直接调用
	public static final Object OBJB = new Object();
}
/**
 * 主方法
 */
public class TheardLockDead {
	public static void main(String[] args) {
		Test t1 = new Test(true);//t1进if
		Test t2 = new Test(false);//t2进else
		
		Thread t11 = new Thread(t1);
		Thread t22 = new Thread(t2);
		
		t11.start();
		t22.start();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值