码迷,mamicode.com
首页 > 编程语言 > 详细

线程的三种创建方式

时间:2021-02-20 12:14:49      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:动态   开机   操作   png   span   public   扫描   ati   多线程   

  • 0.线程简介:

  程序:指令和数据的集合,是静态的概念。
  进程:一个运行的程序可以理解为为一个进程,是程序的一个动态的概念,如运行中的WPS、360、QQ等。
  线程:一个进程中可以有多个线程,如在流氓软件360中,你可以同时清理垃圾、扫描病毒、开机优化等,又如在Edge浏览器中LSP可以边浏览PornHub网站寻找资源,边下载符合自己审美的FBI-WARNING视频。


 

  进程和线程的比较:进程是系统资源分配的单位,而线程是CPU调度和执行的单位。进程和线程的本质的区别在于每个进程拥有自己的一整套变量,而线程则共享数据。
实现多线程是采用一种并发执行机制。
  并发执行机制原理:简单地说就是把一个处理器划分为若干个短的时间片每个时间片依次轮流地执行处理各个应用程序,由于一个时间片很短,相对于一个应用程序来说,就好像是处理器在为自己单独服务一样,从而达到多个应用程序在同时进行的效果。多线程就是把操作系统中的这种并发执行机制原理运用在一个程序中,把一个程序划分为若干个子任务,多个子任务并发执行,每一个任务就是一个线程。这就是多线程程序。



  并发和并行:

技术图片
  并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的。

  • 1. 线程的三种创建方式:
1 /**
2 * 线程的创建方式:
3 * 继承Thread类
4 * 实现Runnable接口
5 * 实现Callable接口
6 */

①第一种方式:继承Thread类

 1 //定义类,继承Thread类-->重写run方法-->实例化定义类-->调用实例对象的start方法
 2 public class ThreadDemo {
 3     public static void main(String[] args) {
 4         Thread1 thread1 = new Thread1();
 5         thread1.start();//线程不一定立即执行,CPU安排调度
 6         for(int i=0;i<2000;i++){
 7             System.out.println("main:"+i);
 8         }
 9     }
10 }
11 //继承Thread类-->重写run方法-->调用start方法
12 class Thread1 extends Thread{
13     @Override
14     public void run(){
15         for(int i=0;i<2000;i++){
16             System.out.println("thread1:"+i);
17         }
18     }
19 }

②第二种方式:实现Runnable接口

 1 //定义类,实现Runnable接口-->重写run方法-->实例化定义类-->创建Thread对象-->Thread对象代理自定义的实例化对象-->调用Thread对象的start方法
 2 public class RunnableDemo {
 3     public static void main(String[] args) {
 4         //创建接口的实现类对象
 5         RunnableClass1 runnableClass1 = new RunnableClass1();
 6         //创建线程对象,通过线程对象实现代理
 7         Thread thread = new Thread(runnableClass1);
 8         //开启线程
 9         thread.start();
10     }
11 }
12 class RunnableClass1 implements Runnable{
13     @Override
14     public void run(){//重写run方法
15         for(int i=0;i<2000;i++) {
16             System.out.println("RunnableClass1:" + i);
17         }
18     }
19 }

③第三种方式:实现Callable接口

 1 /**
 2  * 继承Callable接口(需要返回值)
 3  * 重写call方法
 4  * 创建执行服务
 5  * 提交执行
 6  * 获取结果
 7  * 关闭服务
 8  */
 9 public class CallableDemo {
10     public static void main(String[] args) {
11         CallableClass1 callableClass1 = new CallableClass1();//创建对象
12         //创建执行服务
13         ExecutorService service = Executors.newFixedThreadPool(3);
14         //提交执行
15         Future<Boolean> r1 = service.submit(callableClass1);
16         Future<Boolean> r2 = service.submit(callableClass1);
17         //获取结果
18         try {
19             boolean rs1 = r1.get();
20         } catch (InterruptedException e) {
21             e.printStackTrace();
22         } catch (ExecutionException e) {
23             e.printStackTrace();
24         }
25         //关闭服务
26         service.shutdownNow();
27     }
28 }
29 class CallableClass1 implements Callable<Boolean> {
30     public Boolean call(){
31         System.out.println(Thread.currentThread().getName());
32         return true;
33     }
34 }

  • 2.三种创建方式的比较:

  继承Thread类受限于Java单继承的特性,而实现Runnable接口避免了这种限制,并且,实现了Runnable接口的类的一个实例可以同时被多个线程操作。

线程的三种创建方式

标签:动态   开机   操作   png   span   public   扫描   ati   多线程   

原文地址:https://www.cnblogs.com/WhiteThornZzf/p/14417080.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!