欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

多线程——程序、进程、线程及创建线程的5种方法

时间:2023-07-06
程序、进程、线程概念

程序:可执行文件,如,QQ.exe、项目jar包、war包、Linux中.sh
进程:进程是资源分配的基本单位,程序运行会产生一个进程,没有限制的话一个程序可以多运行几个,便产生多个进程;我们一般打开的QQ、QQ音乐、office、浏览器都是相应的程序运行产生的进程。
线程:CPU调度的基本单位,一个程序中不听的执行路径。如:QQ音乐在听歌的同时,歌词在在跟着自动往上滑。音乐播放是一个线程、歌词滑动是一个线程,各司其职,相互关联。

创建线程的5种方法

注意:所谓5种方法,其本质及底层都是Thread类实现,只是做了相应的封装与设计,以达到其他需求与效果

1、继承Thread类

特点:相对局限,由于java的单继承特性,使得自己的线程类只能继承Thread的方法,没办法再继承其他类。(不推荐使用)

public class ThreadTest { private static class Mythread extends Thread { @Override public void run() { for(int i=0; i<10; i++) { try { TimeUnit.MICROSECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread" + i ); } } } public static void main(String[] args) { new Mythread().start(); for(int i=0; i<10; i++) { try { TimeUnit.MICROSECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main"); } }}

2、实现Runnable接口

特点:自己的线程类在实现Runnable接口时还可以继承其他类,相对继承Thread来说更加优雅。

public class ThreadTest { static class MyThread implements Runnable { @Override public void run() { System.out.println("MyThread"); } } public static void main(String[] args) { new Thread(new MyThread()).start(); }}

3、Lamda表达式

特点:本质是匿名类、重写run方法

public class ThreadTest { public static void main(String[] args) { new Thread(()->{ System.out.println("LambdaThread"); }).start(); }}

4、线程池

特点:* 降低资源消耗,提高响应速度 提高线程的可管理性*,利用已创建的线程执行任务,减少系统创建线程的资源消耗和时间,并对线程进行统一管理、分配、监控、调优

public class ThreadTest { static class Task implements Runnable { @Override public void run() {System.out.println(Thread.currentThread().getName() + " Task "); } } public static void main(String[] args) { ThreadPoolExecutor pool= new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(4), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); for (int i = 0; i < 5; i++) { pool.execute(new Task()); } pool.shutdown(); }}

5、实现Callable类,并结合FutureTask

特点:实现该类的线程类,可有返回值

public class ThreadTest { static class Mythread implements Callable{ @Override public String call() throws Exception { return "我是可以有返回值的"; } } public static void main(String[] args) throws ExecutionException, InterruptedException { Mythread mythread = new Mythread(); FutureTask task = new FutureTask(mythread); Thread thread = new Thread(task); thread.start(); System.out.println(task.get()); }}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。