线程和进程的区别?
- 线程是进程的一个执行流,一个进程中可以包含多个线程。
- 当系统运行时,系统就会自动的分配内存,这时就创建了进程。
- 进程是程序运行的最小单元,线程是进程中的最小单元。
java中有几种方法来实现线程?
- 两种。
- 第一种是继承Theard类,重写run()方法,然后创建Theard类,调用start()方法来启动线程。
- 第二种是实现Runnable接口,重写run()方法,然后创建线程的引用,创建Theard类的带引用参数的构造创建线程对象,调用start方法启动线程。
同步和异步的区别?
- 同步:发送一个请求,等待系统返回后才能发送下一个请求,中间有个等待时间。
- 异步:程序不用等待其他请求的返回,随时都可以发送请求。
- 区别:同步的效率低,但是安全性高;异步的效率高,但是安全性低。
什么情况下使用同步、什么情况下使用异步?
- 一般我们写程序时默认使用异步,因为效率高;
- 但是,当出现多个线程处理共享数据,为了避免一个线程处理的时,另一个线程也来处理这个共享数据,造成脏数据的情况,就使用同步的方法,同步就会限制一次只能一个线程来处理,保证共享数据的安全性。
如何实现同步?
- 同步的关键字synchronized;
- 可以使用同步代码块;synchronized关键字,括号锁对象。
- 也可以使用同步方法:在方法权限修饰符后面添加关键字synchronized;
线程都有什么状态?以及状态之间的关系?
- 五种状态:创建、运行、冻结、临时阻塞、消亡。
sleep()和wait()的区别(重要)?
- 主要区别:
- sleep()不会释放锁对象,其他线程无法进入同步锁。
- wait()方法会释放所对象,当前线程进入线程池,等待其他线程调用notify方法唤醒线程。
- 次要的区别:
- sleep()方法必须设置等待时间。wait方法可以设置也可以不设置。
- sleep()时间到线程就处于临时阻塞或者运行,wait没有时间的话,必须要等到notify或者notifyAll来唤醒。
- sleep不一定要定义在同步方法中。wait必须要定义到同步方法中。
线程如何停止?
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
- 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。
- 使用interrupt方法中断线程。
编写一个死锁程序。
package com.aaa.test;
class Test implements Runnable{
private boolean bo;
public Test(boolean bo) {
this.bo = bo;
}
@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);
Test t2 = new Test(false);
Thread t11 = new Thread(t1);
Thread t22 = new Thread(t2);
t11.start();
t22.start();
}
}