1.线程和进程的联系和区别是什么?
线程:是隶属于操作系统的概念,是程序执行中的单个顺序流程。
进程:是一个执行中的程序,是操作系统对其资源进行分配的基本单位。
多线程就是一个进程中可以同时运行多个不同的线程,执行不同的任务。
区别:同类的多个线程共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据以及一个供程序执行时使用的堆栈。
2.什么是前台线程,什么是后台线程?
前台线程:在主线程运行结束后,若前台线程没有运行完则会阻止主线程的关闭。
后台线程:在主线程运行结束后,整个线程会结束。
即在JAVA中,只有前台线程都结束时,程序才会结束。如果一个程序只有后台线程运行时,程序就会结束。
3.创建线程有几种方法?他们之间的区别是什么?
两种:
>>通过继承Thread类重写Run方法创建。
>>实现Runnable接口的方法。
区别就是,继承Thread类就无法继承别的类,而实现Runnable接口就可以继承别的类,而且用这种方法多个线程可共享实现类对象的资源。
4.线程的生命周期有哪些状态?哪些方法可以改变这些状态?
五种状态:创建状态、就绪状态、运行中状态、阻塞状态和死亡状态。
new运算符创建线程;
start方法启动线程,变成就绪状态;
join、sleep、wait方法使正在执行的线程进入阻塞状态;
线程到达其run方法末尾或者意外终止则会死亡
5.什么是线程安全?为什么会产生线程安全问题?如何解决线程安全问题?
线程安全:即线程同步,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问。
原因:
1.存在两个或者两个以上的线程对象共享同一个资源;
2多线程操作共享资源代码有多个语句。
解决:同步代码块,用synchronized关键字
6.什么是线程的同步通信?同步通信又是如何实现的
为了保证线程的安全,使线程在执行时不被其他线程打断从而确保了共享资源的安全性。Synchronized关键字可以实现同步通信。
7.什么是死锁?
如果多个线程都处于等待状态,彼此需要对方所占用的监视器所有权,就构成死锁。
8.如何让某个对象的A方法内的一个代码块和另一个方法B实现同步?
课本例9.11
9.设计一个程序产生两个线程A和B,B线程执行10秒后,被A线程中止
package birthday;
class Account{
int b=0;
void change(int _a){b=_a;}
int getb(){return b;}
volatile private int value;
synchronized void put(int i){
value = value + i;
System.out.println("存入"+i+", 账上金额为:"+value);
}
}
class Save implements Runnable{
private Account a1;
public Save(Account a1){this.a1 = a1;}
public void run(){
while(a1.getb()==0) {
try {
Thread.sleep(900);
}catch(InterruptedException e){
e.printStackTrace();
}
a1.put(1);
}
System.out.println("10秒已到,停止存钱。stop!");
}
}
class Fetch implements Runnable{
private Account a1;
public Fetch(Account a1){this.a1 = a1 ;}
public void run(){
if(a1.getb()==0){
try {
Thread.sleep(9000);
}catch(InterruptedExpection e){}
}
a1.change(1);
}
}
public class Test{
public static void main(String[] args){
Account a1 = new Account();
new Thread(new Save(a1)).start();
new Thread(new Fetch(a1)).start();
}
}