线程的介绍与创建
这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活
。
目录
1.进程:是程序的一次执行过程,或是正在运行的一个程序 。由程序、数据和进程控制块三部分组成。比如 运行中的 IDEA,vscode
2.线程:是进程中实际运作的单位,是一个程序内部的一条执行路径。
总结
:一个操作系统可以同时执行多个任务,每个任务就是一个进程;一个进程可以执行多个任务,每个任务就是线程。
3.两者之间的关系:一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程,即主线程。多个线程共享进程的全部系统资源,同时线程还拥有自己独立的程序计数器、虚拟机栈、本地方法栈。
进程之间不能共享内存;线程之间相互独立,且共享进程中的资源,提高计算机 CPU 的利用率。
多线程技术使程序的响应速度更快,增强用户的体验。
1.继承 Thread 类 创建线程
定义一个继承 Thread 类的子类;
重写该类的 run()方法,将线程执行的操作声明在 run()方法里面;
创建 Thread 类子类的对象;
调用线程对象的 start()方法来启动线程。
// 1.创建一个继承于 Thread 类的子类
class MyThread extends Thread {
// 2.重写 Thread 类的 run 方法
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName()+": "+i);
}
}
}
}
public class ThreadTest {
public static void main(String[] args) {
// 3.创建 Thread 类子类的对象
MyThread t1 = new MyThread();
// 4.通过此对象调用 start
t1.setName("线程 A");
t1.start();
MyThread t2 = new MyThread();
t2.setName("线程 B");
t2.start();
}
}
2.实现 Runnable 接口 创建线程
定义一个实现了 Runnable 接口的类;
重写 run()方法,将线程执行的操作声明在 run()方法里面;
创建实现类的对象;
将此对象传递到 Thread 类的构造器中创建 Thread 对象;
调用线程对象的 start()方法启动该线程。
// 1.创建一个实现 Runnable 接口的类
class MyThread implements Runnable {
// 2.实现类去实现 Runnable 中的抽象方法 run()
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}
publi
c class ThreadTest2 {
public static void main(String[] args) {
// 3.创建实现类的对象
MyThread m = new MyThread();
// 4.创建 Thread 类的对象
Thread t1 = new Thread(m);
t1.setName("线程 A");
// 5.启动线程
t1.start();
Thread t2 = new Thread(m);
t2.setName("线程 B");
t2.start();
}
}
两种方式的比较
:
两种方式都需要重写 run(),将线程要执行的操作声明在 run()中。
第一种方式是继承 Thread 类,因 Java 是单继承,如果一个类继承了 Thread 类,那么就没办法继承其它的类了。
第二种 实现的方式没有类的单继承性的局限性,实现的方式更适合来处理多个线程有共享数据的情况。所以实际开发就使用第二种方式。
3.使用 Callable 和 Future 创建线程
从 Jdk 1.5 开始,Java 提供了 Callable 接口,Callable 接口提供了 Call()方法作为线程的执行体。call()方法可以有返回值,也可以声明抛出异常,因此它可看作是 Runable 接口的增强版。
创建一个 Callable 的实现类,实现 Call 方法,将此线程需要执行的操作声明在 Call 方法里面;
创建 Callable 接口的实现类对象;
将此对象传递到 FuterTask 构造器中,创建 FuterTask 对象;
创建 Thread 对象,调用 start 启动线程;
调用 FuterTask 对象的 get()方法来获得线程结束后的返回值;
class MyThread implements Callable {
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 0; i <= 20; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
sum += i;
}
评论