1.进程与线程的区别
进程:操作系统进行资源分配和调度的一个独立单位。
每个进程都有自己的独立内存空间,一个进程无法直接访问其他进程的内存。
比如你打开一个应用程序,比如浏览器,那么操作系统就会创建一个新的进程来运行这个应用程序。
线程:线程是进程的一个实体,是CPU调度和分派的基本单位,
一个进程可创建多个线程,这些线程都运行在该进程的内存空间内,线程之间可共享进程的资源。
比如在浏览器中打开多个标签页,每个标签页都可以看作是一个独立的线程。
eg:
进程:当你启动QQ时,操作系统会为QQ创建一个新的进程。这个进程包含了QQ的代码、数据和各种资源。QQ的所有功能,比如聊天、文件传输、音视频通话等,都是在这个进程中运行的。
线程:QQ进程中的每一个功能,都可能对应一个或多个线程。比如,可能有一个线程负责接收和发送消息,一个线程负责处理用户界面,一个线程负责网络通信,一个线程负责音视频处理等。这些线程并行运行,共同完成QQ的各种功能。
比如说,当你在QQ中聊天时,你输入的每一个字都可能会触发一个事件处理线程去处理,将这个字显示在聊天窗口中;同时,还有一个网络通信线程在后台运行,不断地接收和发送消息,保持你的聊天状态是最新的。
这样的设计可以使QQ更好地响应用户的操作,提高程序的运行效率。
2.线程的创建方式
2.1 继承Thread类(package java.lang),重写run方法
public class MyThread extends Thread{
@Override
public void run() {
System.out.println("run方法的方法体就是线程执行的的内容");
}
public static void main(String[] args) {
//创建Thread子类实例
MyThread myThread = new MyThread();
//调用start方法启动线程
myThread.start();
}
}
2.2实现Runable接口,重写run方法
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("run方法的方法体就是线程执行的内容");
}
public static void main(String[] args) {
//创建Runnable实现类的实例
MyRunnable myRunnable = new MyRunnable();
//将实例作为Thread类的参数
Thread thread = new Thread(myRunnable);
//调用start方法启动线程
thread.start();
}
}
2.3实现Callable接口重写call方法, 并使用Futuretask类
Java 1.5开始,可以使用实现Callable接口的方式来创建线程,Callable接口的call()方法允许有返回值。然后使用FutureTask类来包装Callable对象,因为FutureTask类实现了Runnable接口,所以可以作为Thread类的参数。
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
//call方法的方法体就是线程执行的内容
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建Callable实现类的实例
MyCallable myCallable = new MyCallable();
//创建FutureTask类包装myCallable对象,因为FutureTask类实现了Runnable接口
FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
//创建Thread类的实例,将FutureTask对象作为参数传入
Thread thread = new Thread(futureTask);
//调用start方法启动线程
thread.start();
//可以使用FutureTask的get方法来获取线程的执行结果。注意,get方法是阻塞的,它将等待直到线程执行完毕。
System.out.println("Sum is " + futureTask.get());
}
}