多线程的实现方式
1.多线程概述
进程和线程
进程:正在运行的程序,是系统进行资源分配和调用的独立单位。
每一个进程都有它自己的内存空间和系统资源。
线程:是进程中的单个顺序控制流,是一条执行路径;
一个进程如果只有一条执行路径,则称为单线程程序。
一个进程如果有多条执行路径,则称为多线程程序。
2.如何实现多线程
由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。但是,Java语言是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。只能去调用C/C++写好的程序来实现多线程程序。而又由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西,然后提供一些类供我们使用。我们就可以实现多线程程序了。
Java提供了三种实现方式,下面我们来一一讲解。
2.1实现方式一:继承Thread类
1.自定义一个类,继承自Thread类;
2.在这个类中重写Thread类中的run()方法;
3.在主线中开启子线程main线程;
3.1创建自定义线程类对象;
3.2使用线程类对象调用run()方法还有start()方法;
首先自定义一个类MyThread,继承自Thread类。提供了一个方法run()。
public class MyThread extends Thread {
public void run() {
for(int x = 0 ; x < 100;x ++) {
System.out.println(x);
}
}
}
定义一个测试类,创建对象“a”分别去启动线程,调用上面的方法run()。
public class Test {
public static void main(String[] args) {
MyThread a = new MyThread();
a.start();
a.run();
}
}
2.2实现方式二:接口Runnable
实现步骤:
1.自定义一个类,实现 Runnable接口 (资源类);
2.实现接口中提供的功能:public abstract void run();
3.在用户线程main中创建资源类对象,创建Thread类对象,将对象作为参数传递,分别启动线程。
public class MyRunnable implements Runnable{
@Override
public void run() {
for(int x = 0 ; x < 100 ; x++) {
//使用Thread.currentThread()--->正在运行的线程
System.out.println(Thread.currentThread().getName()+":"+x);
}
}
}
public class Test {
public static void main(String[] args) {
//创建资源类对象
MyRunnable my = new MyRunnable();
//创建线程类对象
Thread t1 = new Thread(my);
Thread t2 = new Thread(my);
//给线程设置一个名称
t1.setName("简自豪");
t2.setName("明");
//分别启动线程
t1.start();
t2.start();
}
}
2.3实现方式三:线程池
实现步骤:
此处我们需要借助Executors工具类提供的newFiexdThreadPool(int nThreads)方法;
1.创建线程池对象: S pool = Executors.newFiexdThreadPool(int nThreads){};
2.提交异步任务 submit(Callable call);
实现Callable:接口 ;
3.关闭资源;
import java.util.concurrent.Callable;
public class MyCallable implements Callable {
@Override
public Object call() throws Exception {
for(int x = 0 ; x < 100 ; x ++) {
System.out.println(Thread.currentThread().getName()+":"+x);
}
return null;
}
}
public class ExecutorServiceDemo {
public static void main(String[] args) {
//1)创建线程池对象
ExecutorService pool = Executors.newFixedThreadPool(2) ;
//2)提交异步任务
pool.submit(new MyCallable()) ;
pool.submit(new MyCallable()) ;
//3)关闭资源
pool.shutdown();
}
}