博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第四篇:多线程技术
阅读量:5839 次
发布时间:2019-06-18

本文共 2541 字,大约阅读时间需要 8 分钟。

1.线程与进程

进程:正在进行中的程序(直译)。

线程:就是进程中一个负责程序执行的控制单元(执行路径),

一个进程中可以多执行路径,称之为多线程。

一个进程中至少要有一个线程。

开启多个线程是为了同时运行多部分代码。

每一个线程都有自己运行的内容。这个内容可以称为线程要执行的任务。

多线程好处:解决了多部分同时运行的问题。

多线程的弊端:线程太多回到效率的降低。

其实应用程序的执行都是cpu在做着快速的切换完成的,这个切换是随机的。

JVM启动时就启动了多个线程,至少有两个线程可以分析的出来。

1,执行main函数的线程,该线程的任务代码都定义在main函数中。

2,负责垃圾回收的线程。

2.创建线程方法之一即继承thread类

步骤:

1,定义一个类继承Thread类。

2,覆盖Thread类中的run方法。

3,直接创建Thread的子类对象创建线程。

4,调用start方法开启线程并调用线程的任务run方法执行。

 可以通过Thread的getName获取线程的名称 Thread-编号(从0开始)

 主线程的名字就是main。

Demo
1 class Demo extends Thread  2 {  3  private String name;  4  Demo(String name)  5  {  6   super(name);  7   //this.name = name;  8  }  9  public void run() 10  { 11   for(int x=0; x<10; x++) 12   { 13    //for(int y=-9999999; y<999999999; y++){} 14    System.out.println(name+"....x="+x+".....name="+Thread.currentThread().getName()); 15   } 16  } 17 } 18  19 class ThreadDemo2  20 { 21  public static void main(String[] args)  22  { 23  24   /* 25   创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行。 26    27   而运行的指定代码就是这个执行路径的任务。 28  29   jvm创建的主线程的任务都定义在了主函数中。 30  31   而自定义的线程它的任务在哪儿呢? 32   Thread类用于描述线程,线程是需要任务的。所以Thread类也对任务的描述。 33   这个任务就通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的  函数。 34    35   run方法中定义就是线程要运行的任务代码。 36  37   开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法。 38   将运行的代码定义在run方法中即可。  39   */ 40 // 41 //  Thread t1 = new Thread(); 42  43   Demo d1 = new Demo("旺财"); 44   Demo d2 = new Demo("xiaoqiang"); 45   d1.start();//开启线程,调用run方法。 46    47   d2.start(); 48   System.out.println("over...."+Thread.currentThread().getName()); 49  } 50 }

3.创建线程方法之二即实现Runnable接口

1,定义类实现Runnable接口。

2,覆盖接口中的run方法,将线程的任务代码封装到run方法中。

3,通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。

 为什么?因为线程的任务都封装在Runnable接口子类对象的run方法中。

 所以要在线程对象创建时就必须明确要运行的任务。

4,调用线程对象的start方法开启线程。

 实现Runnable接口的好处:

1,将线程的任务从线程的子类中分离出来,进行了单独的封装。

 按照面向对象的思想将任务的封装成对象。

2,避免了java单继承的局限性。

所以,创建线程的第二种方式较为常用。

demo
1 class Demo implements Runnable//extends Fu //准备扩展Demo类的功能,让其中的内容可以作为线程的任务执行。  2      //通过接口的形式完成。  3 {  4  public void run()  5  {  6   show();  7  }  8  public void show()  9  { 10   for(int x=0; x<20; x++) 11   { 12    System.out.println(Thread.currentThread().getName()+"....."+x); 13   } 14  } 15 } 16  17 class  ThreadDemo 18 { 19  public static void main(String[] args)  20  {  21   Demo d = new Demo(); 22   Thread t1 = new Thread(d); 23   Thread t2 = new Thread(d); 24   t1.start(); 25   t2.start(); 26  27 //  Demo d1 = new Demo(); 28 //  Demo d2 = new Demo(); 29 //  d1.start(); 30 //  d2.start(); 31  } 32 }

 

 

转载于:https://www.cnblogs.com/gaodao/archive/2013/02/22/2921837.html

你可能感兴趣的文章
Mockito使用注意事项
查看>>
[LeetCode] Palindrome Linked List 回文链表
查看>>
UVA - 825Walking on the Safe Side(dp)
查看>>
android大概是通过logcat拦截Log
查看>>
关于codeMirror插件使用的一个坑
查看>>
评论:人才流失强力折射出现实畸形人才观
查看>>
git服务器gitlab之搭建和使用--灰常好的git服务器【转】
查看>>
基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否...
查看>>
分享一种需求评审的方案
查看>>
虚拟运营商10月或大面积放号 哭穷背后仍有赢家
查看>>
Server2016开发环境配置
查看>>
分布式光伏发电建设中的逆变器及其选型
查看>>
增强网络安全防御 推动物联网走向应用
查看>>
UML中关联,组合与聚合等关系的辨析
查看>>
《大数据管理概论》一3.2 大数据存储与管理方法
查看>>
PowerBuilder开发简单计算器
查看>>
怎样使用linux的iptables工具进行网络共享
查看>>
《HTML5与CSS3实战指南》——导读
查看>>
RHEL6下安装oracle 10g(一)
查看>>
Kconfig的格式
查看>>