一·【概念】

      一般来说,我们把正在计算机中运行的程序叫做“进程”(process),而不将其称为“程序”(program)。

所谓“线程”(thread)。是“进程”中某个单一顺序的控制流。

新兴的操作系统。如WindowsNT、Windows95等,大多採用多线程的概念,把线程视为基本运行单位。

     用最普通的话定义线程。即:一个程序(进程)里边不同的运行路径,即线程

二·【问题】

       ·引入线程,给我们带来了什么优点?

三 ·【实例分析】

   (1)引入线程,给我们带来了什么优点?我们对照于没有引用线程。会怎么样?

  (a)引用线程代码:

/*引用线程*/

//主方法main()
public class TestThread
{
public static void main(String args[])
{
Runner r = new Runner();
//下边两行代码是体现多线程同步运行的一个过程。必须声明thread。 Thread t = new Thread(r);
t.start();//通过调用thread对象的start方式启动线程运行
for(int i=0;i<100;i++)
{
System.out.println("Main Thread:"+i);
}
}
}
//通过实现runnable接口实现多线程
class Runner implements Runnable {
public void run()
{
for(int i=0;i<100;i++)
{
System.out.println("Runner"+i);
}
}
}

  (b) 不引用线程代码:

/*不引用线程*/

//主方法main()
public class TestThread
{
public static void main(String args[])
{
Runner r = new Runner();
//区别在这句话
r.run();//直接调用runner对象的run方法,不引用thread线程
for(int i=0;i<100;i++)
{
System.out.println("Main Thread:"+i);
}
}
}
//通过实现runnable接口实现多线程
class Runner implements Runnable {
public void run()
{
for(int i=0;i<100;i++)
{
System.out.println("Runner"+i);
}
}
}

对照运行结果:

   <没有引入线程>                                                      <引用线程>   

 
       
  

   结果分析:

    在没有引用线程时,它是顺着main函数运行。什么意思呢?就是说在main函数中。先把r.run()方法运行完毕后。在运行main函数剩下的部分;用一张图来描写叙述此过程:

    而在引入线程时,它是这样运行的:r.run()和main函数中的输出两个是同步运行:什么意思呢?就是说r.run()方法的运行不影响main函数的顺序运行。用一张图来描写叙述此过程:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

   最后再用几句话总结该过程:

      1·程序启动时会有一个由主方法(public static void main(){})所定义的线程。

      2·通过实现Runnable接口的实例来实现多线程。

      3·通过创建Thread实例来创建新的线程。

       解释:在java中有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类仅仅要继承了Thread类同一时候腹泻了本类中的run()方法就能够实现多线程操作了,但因为在java中一个类仅仅能继承一个父类,所以,实际中多用实现Runnable接口来实现多线程。

      4·每一个线程都是通过某个特定的thread对象相应的方法run()来完毕操作。

(方法run()成为线程体)

      5·通过调用thread类的start()方法来启动一个线程。

   【4·抛砖引玉】

    以上实例仅仅是简单的解析引入线程同步给我们带来了什么方便之处?通过代码的实现,显然看出。其提高了cpu的处理速度。事实上这些问题我们在课本上都明确,但详细在代码中是怎么实现的?我们须要实践一番。包含下面几个问题,怎样用代码实现。我们应该怎么做呢?

         1·当两个线程同一时候对一个资源操作,可能会给我们带来什么问题?

         2·我们该怎么避免第2个问题呢?

         3·假设使用锁的方式不当。会带来什么问题?

 

java——简单理解线程的更多相关文章

  1. 线程和线程池的理解与java简单例子

    1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...

  2. Java提高班(二)深入理解线程池ThreadPool

    本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...

  3. 【转】Java学习---深入理解线程池

    [原文]https://www.toutiao.com/i6566022142666736131/ 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很 ...

  4. 并发王者课 - 青铜 2:峡谷笔记 - 简单认识Java中的线程

    在前面的<兵分三路:如何创建多线程>文章中,我们已经通过Thread和Runnable直观地了解如何在Java中创建一个线程,相信你已经有了一定的体感.在本篇文章中,我们将基于前面的示例代 ...

  5. 【转】关于Java的Daemon线程的理解

    原文地址:http://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html 关于Java的Daemon线程的理解 网上对Java的Dae ...

  6. 【Android】线程池原理及Java简单实现

    线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为: T1 创建线程时间 T2 在线程中 ...

  7. [译]线程生命周期-理解Java中的线程状态

    线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...

  8. 【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  9. Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。

    java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...

随机推荐

  1. 紫书 例题 10-5 UVa 12716 (枚举方式)

    设gcd(a, b) = a xor b = c 那么我们可以证明c=a-b 那么同时c又是a的因子(c是a与b的最大公因数) 所以我们可以枚举c,然后枚举c的倍数,也就是a 有了a和c可以算出b为a ...

  2. Select For update语句浅析

    Select -forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不 ...

  3. Thinking in UML 学习笔记(三)——UML核心视图之类图

    类图的作用:用于展示系统中的类及其相互之间的关系. UML在解决面向对象的方法中对类理解为三个层次,各自是:概念层.说明层.实现层.在UML中,从開始的需求到终于设计类,类图也是环绕这三个层次的观点进 ...

  4. 【Android进阶】Junit单元測试环境搭建以及简单有用

    单元測试的目的 首先.Junit单元測试要实现的功能,就是用来測试写好的方法是否可以正确的运行,一般多用于对业务方法的測试. 单元測试的环境配置 1.在AndroidManifest清单文件的Appl ...

  5. AES加密解密在JAVA和ANDROID下互通

    <span style="font-family: Arial, Helvetica, sans-serif;">昨天外包安卓的那个人说AES的加解密结果不一样.于是百 ...

  6. thinkphp里面的or查询

    thinkphp里面的or查询 whereOr 方法 使用whereOr 方法进行OR 查询: Db::table('think_user') ->where('name','like','%t ...

  7. 洛谷P4051 [JSOI2007]字符加密

    题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法. 例如‘JSOI07’,可以读作 ...

  8. PHP获取随机字符串的两种方法

    <?php /** * 随机返回字符串 * @param number 返回字符串长度 * @param string 从哪些字符串中随机返回,已设置默认字符串,可空 * @return str ...

  9. 学习参考《矩阵分析与应用(第二版)张贤达》PDF

    要想深入理解机器学习,或者对人工智能的某个领域有所研究,都必须掌握矩阵及其应用. 学习<矩阵分析与应用第2版>时,会发现总结了大量线性代数的知识,主要是给工科生用的.归纳了不少论文中的解法 ...

  10. 【Linux下权限控制之chmod与chown命令】

    chmod 用于配置文件/目录权限 命名格式:chmod [选项] 文件/目录名 . 权限类别: r 读取 可用数字4表示 w 写入 可用数字2表示 x 执行 可用数字1表示 . 归属类别: u 属主 ...