线程

线程是什么:

线程是操作系统中的最小单位,包含在进程中,是进程中的实际运行单位。

线程作用:

进行多处理编程,通过多线程提高程序运行速度。

线程和进程区别:

进程相当于一个独立的运行环境,可以被看作为一个应用或者程序。而线程相当于其中的某个模块或者一段代码。一个进程有多个线程,而每个线程执行不同的任务,不同的进程拥有不同的内存空间,而线程享有一片相同的空间。(不同进程的内存空间不同,线程内存空间相同)。而每个线程又有不同的栈空间存储数据。

如何实现线程:

1.通过继承Thread类来创建线程。

public class Thread1 extends Thread {
@Override
public void run() {
//方法线程体
for (int i = 0; i <2 ; i++) {
System.out.println("我创建了第"+i+"个线程");
}
}
public static void main(String[] args) {
//main主线程
//创建实现类对象
Thread1 thread1 = new Thread1();
thread1.start();
for (int i = 0; i <2; i++) {
System.out.println("我创建了第"+i+"个主线程");
}
}
}
首先定义一个实现类继承thread类,然后在这个实现类里重写thread类的run()方法,在run()方法里写上线程体,然后在main()方法里创建一个实现类对象 p,然后通过调用p.start()开启线程。
如果在main()方法里有主线程,开启线程后,第一次执行是主线程,之后执行顺序会看CPU心情,谁抢到谁执行。

2.通过实现Runable接口来实现线程。

public class Runable1 implements Runnable {
public void run() {
for (int i = 0; i <2 ; i++) {
System.out.println("我创建了第"+i+"个线程");
}
}
public static void main(String[] args) {
Runable1 runable1 = new Runable1();
// new Thread(runable1).start();
//创建代理类对象
Thread thread = new Thread(runable1);
//启动线程
thread.start();
for (int i = 0; i <2 ; i++) {
System.out.println("我创建了第"+i+"个主线程");
}
}
}
首先定义一个实现类继承thread类,然后在这个实现类里重写Runable接口的run()方法,在run()方法里写上线程体,然后在main()方法里创建一个实现类对象 p,
再创建一个代理类对象,通过调用代理类对象的start方法来启动线程。


Java不允许类的多继承,但是可以调用多个接口,如果你要继承其他类,那么Runable接口会比继承Thread类更好。

Thread 类中的start() 和 run() 方法有什么区别?
start()方法用来启动新创建的线程,使线程状态变为运行态。而run()方法不能启动新的线程,只能调用原来的线程。

什么是线程安全,Vector是一个线程安全类吗?
Vector采用同步方法来实现线程安全,而和它类似的ArrayList线程是不安全的。进程里面的多个线程同时运行,这些线程运行相同的代码,每次运行结果和单线程结果一样,那么线程就是安全的。

Java中如何来停掉一个线程?
1.等待一个线程里面方法自动运行完。
2.设置一个标识位,再设置一个停止线程方法,转换标识位,调用停止线程方法,让线程停止。
3,用volatile布尔变量来退出run()方法的循环或者是取消任务来中断线程。

Java中notify和notifyall有什么区别?
notify只有在一个线程等待唤醒的情况下,才能使用。notifyall是唤醒所有等待的线程,并允许它们争取锁确保至少有一个线程可以继续允许。


多线程使用的规则
给线程起规范的命名。
避免锁定和缩小同步的范围。
多用同步类少用wait和notify。
多用并发集合少用同步集合。

多线程wait和sleep有什么区别?
都会造成线程的暂停,wait方法用于线程之间的通信,如果等待条件为真且其他线程被唤醒时,它会释放锁。
sleep仅仅只是线程的休眠,不会释放锁,等时间结束后,线程会立马进入运行状态。






posted @ 2021-02-28 22:53  歪歪头  阅读(44)  评论(0)    收藏  举报