java创建多线程的几种方法
线程和进程
进程:执行的应用程序。
线程:进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
线程调度
分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。
抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
用户可在任务管理器中的详细信息列表设置线程的优先级
创建多线程程序 =>继承thread/实现Runnable/实现Callable(线程池)
创建多线程程序的第一种方式:继承thread类
java.lang.Thread:就是一个描述线程的类,类想实现多线程,就必须继承Thread类。
线程是程序中执行的线程。 Java虚拟机允许应用程序同时运行多个执行线程。
java程序属于抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个线程执行(线程随机性)
- 创建Thread类的子类,继承Thread类
- 在Thread类的子类中,重写Thread类的run方法,设置线程任务(开启新的线程的目的
- 创建一个对象
- 调用start函数
public class ThreadDemo extends Thread{
//2.在Thread类的子类中,重写Thread类的run方法,设置线程任务(开启新的线程的目的)
@Override
public void run() {
//新线程执行run方法
for (int i = 0; i < 20; i++) {
System.out.println("run-->"+i);
}
}
public static void main(String[] args) {
//3.创建Thread类的子类对象
ThreadDemo t1 = new ThreadDemo();
//t1.run(); 不会开启新线程,只有主线程,会顺序执行
//4.调用start函数,主线程和子线程交替运行
t1.start();
//main线程,即主线程
for (int i = 0; i < 20; i++) {
System.out.println("main-->"+i);
}
}
}
创建多线程程序的第二种方式:实现Runnable接口
java.lang.Runnable
Runnable接口应由任何其实例由线程执行的类实现。 该类必须定义一个名为run的无参数的方法。
java.lang.Thread类的构造方法:
Thread(Runnable target) 分配新的 Thread对象。
Thread(Runnable target, String name) 分配新的 Thread对象。
实现步骤:
1:创建一个类实现Runnable接口
2:重写Runnable接口中的run方法,设置线程任务
3:创建Runnable接口的实现类对象
4:创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5:调用Thread类中的start方法,开启新线程,执行run方法
//1.创建一个类实现Runnable接口
public class RunnableImpl implements Runnable {
//2.重写Runnable接口中的run方法,设置线程任务
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
public class Demo01 {
public static void main(String[] args) {
//3.创建Runnable接口的实现类对象
RunnableImpl r = new RunnableImpl();
//4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
Thread t = new Thread(r);
//5.调用Thread类中的start方法,开启新线程,执行run方法
t.start();
//new Thread(r,rname).start;
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
创建多线程程序的第三种方式:实现Callable接口
该类必须定义一个名为call的无参数的方法。(需要抛异常)
实现步骤:
1:创建一个类实现Callable接口(需要有返回值)
2:重写Callable接口中的call方法,设置线程任务(需要抛异常)
3:创建Callable接口的实现类对象
4:创建Executors创建线程池,分配线程池数量
5:提交执行
6:获取结果
public class CallableThread implements Callable<Boolean> {
String url;
String name;
public CallableThread(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() throws Exception {
DownloadUrl(url, name);
System.out.println("下载了" + name);
return true;
}
//主线程
public static void main(String[] args) throws ExecutionException, InterruptedException {
CallableThread t1 = new CallableThread("https://gitee.com/AsteroidQiao/library-management-system/raw/master/book-avatar/1697097432990%E6%88%90%E5%A4%A7%E4%BA%8B.jpg", "成大事1.jpg");
CallableThread t2 = new CallableThread("https://gitee.com/AsteroidQiao/library-management-system/raw/master/book-avatar/1697097856718@%E6%88%90%E6%9E%9C%E6%88%90%E6%9E%9C%E6%88%90%E7%8B%97%20%E7%9A%84%E4%B8%AA%E4%BA%BA%E4%B8%BB%E9%A1%B5%20-%20%E5%BE%AE%E5%8D%9A_d3721ec7.jpg", "成果1.jpg");
CallableThread t3 = new CallableThread("https://gitee.com/AsteroidQiao/library-management-system/raw/master/book-avatar/1697097590301%E7%8E%8B%E6%99%A8%E9%98%B3.jpg", "王晨阳1.jpg");
//创建线程池,数量为3
ExecutorService eService = Executors.newFixedThreadPool(3);
// 提交执行
Future<Boolean> result1 = eService.submit(t1);
Future<Boolean> result2 = eService.submit(t2);
Future<Boolean> result3 = eService.submit(t3);
// 获取结果
boolean r1 = result1.get();
boolean r2 = result2.get();
boolean r3 = result3.get();
System.out.println("r1的值:"+r1+"r2的值:"+r2);
eService.shutdown();
}
//class WebDownloader
//创建一个下载器
public static void DownloadUrl(String url, String name) {
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常");
}
}
}
本文来自博客园,作者:AsteroidQiao,转载请注明原文链接:https://www.cnblogs.com/asteroidqiao/articles/17769008.html

浙公网安备 33010602011771号