什么是线程?
线程(Thread)是计算机操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的一个实体。单个进程可以拥有多个线程,每个线程都可以在不受干扰的情况下并行执行,从而提高了 CPU 利用率和应用程序的响应速度。
由于内存共享和通讯的方便性,线程常用于并发编程中,开发者可以使用多线程来充分利用多核处理器或者多处理器系统的优势,提升程序运行效率与资源利用率。
相对于进程而言,线程更加轻量级,占用的资源更少。同时,线程之间的切换也比进程之间的切换要快得多,因为不需要切换地址空间。但是,由于线程共享资源,因此在进行多线程编程时需要注意线程安全问题,例如数据同步和互斥锁等。
什么是多线程?
多线程(Multithreading)是指在一个应用程序中同时运行多个线程,这些线程可以并行执行不同的任务。
在拥有多核心处理器或者多处理器系统时,使用多线程可以充分利用系统资源,提高程序的执行效率和响应速度。而且,多线程能使程序的代码更加简单易读,更加可维护。
例如,在一个下载应用程序中,我们可以使用一个线程来处理用户操作和界面更新,另外一个线程来进行文件下载和保存等任务。这样,用户可以在下载过程中继续浏览其他页面,而且下载也不会对应用程序的其他功能造成影响。
需要注意的是,在多线程编程中,线程之间的共享资源问题需要特别谨慎。由于多个线程需要访问同一块内存空间,如果没有进行适当的数据同步,可能会导致数据错乱、死锁等问题。因此,开发者需要使用锁、信号量、条件变量等技术来确保线程之间的同步和协作。
创建线程的方式有三种:
-
继承Thread类并重写run()方法,然后创建该类的实例,调用start()方法启动线程。
-
实现Runnable接口,重写run()方法,然后创建Thread类的实例,将实现了Runnable接口的类的实例作为参数传递给Thread类的构造方法,调用start()方法启动线程。
-
实现Callable接口,重写call()方法,然后创建FutureTask类的实例,将实现了Callable接口的类的实例作为参数传递给FutureTask类的构造方法,再创建Thread类的实例,将FutureTask类的实例作为参数传递给Thread类的构造方法,调用start()方法启动线程。
第一种,继承Thread类
package edu.foundation.thread;
public class TestThread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("我正在睡觉");
}
}
public static void main(String[] args) {
TestThread1 myThread = new TestThread1();
myThread.start();
for (int i = 0; i < 200; i++) {
System.out.println("我正在跑步");
}
}
}
第二种,实现Runnable接口
package edu.foundation.thread;
public class TestThread3 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("实现了Runnable接口");
}
}
public static void main(String[] args) {
TestThread3 testThread3 = new TestThread3();
new Thread(testThread3).start();
for (int i = 0; i < 200; i++) {
System.out.println("执行了main函数");
}
}
}
第三种,实现Callable接口
package edu.foundation.thread;
import java.util.concurrent.*;
public class TestCallable implements Callable {
private int ticket=20;
@Override
public Boolean call() {
while(true){
if(ticket<=0){
break;
}
System.out.println(Thread.currentThread().getName()+"买到了第"+ticket--+"张票");
}
return false;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable c1 = new TestCallable();
TestCallable c2 = new TestCallable();
TestCallable c3 = new TestCallable();
// 创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
// 提交执行
Future<Boolean> r1= ser.submit(c1);
Future<Boolean> r2= ser.submit(c2);
Future<Boolean> r3= ser.submit(c3);
// 获取结果
boolean rs1=r1.get();
boolean rs2=r2.get();
boolean rs3=r3.get();
// 关闭服务
ser.shutdownNow();
}
}