目录
一、线程
1)什么是线程?什么是进程?
进程:进程是系统中正在运行的一个程序,程序一旦运行就是进程。
线程:一个进程可以拥有多个线程,线程是进程的一个特定执行路径。
2)线程的创建方式?
继承Thread类:
public class ThreadTest01 {
public static void main(String[] args) {
myThread myThread = new myThread();
myThread.setName("myThread");
//启动线程
myThread.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "-->>" + i);
}
myThread.run = false;
}
}
class myThread extends Thread {
Boolean run = true;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
//这里不把if语句放在for外面是因为线程终止后再次启动时会从上一次终止的地方继续执行
//如果放在外面mian方法里的for循环执行完毕以后会继续从 i = 5 开始执行而不会判断for外面的if语句
if (run) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
return;
}
}
}
}
实现Runnable接口:
public class ThreadTest02 {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
//更改线程的名字
thread.setName("t");
//启动线程
thread.start();
for (int i = 0; i <= 100; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
//实现线程的其中一种方式
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
实现CallAble接口:
使用CallAble实现线程时,启动是调用call()方法,而不是start()方法。使用Callable实现线程时可以返回值,而其他两种不可以
public class ThreadTest03 {
public static void main(String[] args) {
Callable callable = new AAA();
try {
Object call = callable.call();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class AAA implements Callable {
private Object object = new Object();
@Override
public Object call() throws Exception {
synchronized (object) {
System.out.println("执行call方法");
t2();
}
return null;
}
public void t2() {
synchronized (object) {
System.out.println("执行t2方法");
}
}
}
3)线程的生命周期?
新建->就绪->运行->阻塞->死亡
4)什么时候会出现线程安全问题?如何解决?
条件1:多线程并发。
条件2:有共享数据。
条件3:共享数据有修改的行为。
解决方法:线程排队执行。(不能并发)。用排队执行解决线程安全问题。 这种机制被称为:线程同步机制。就是使用synchronized关键字将操作共享数据的代码块进行同步,这样就能保证同一时间只有一个线程能操作数据。
5)并发和并行的区别?
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果
并行(parallel):指在同一时刻有多条指令在多个处理器上同时执行。
来个比喻:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。
6)Java中的守护线程是什么?
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 。用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务,守护线程最典型的应用就是GC(垃圾回收器)。