一·【概念】

      一般来说,我们把正在计算机中运行的程序叫做“进程”(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. 使用glPushMatrix和glPopMatrix的原因

    转自 百度百科   glPushMatrix 函数将当前矩阵堆栈推送,通过一个,复制当前矩阵. 这就是后 glPushMatrix 的调用堆栈的顶部矩阵是它下面的相同的.   1. 原理讲解 终于明白 ...

  2. ArcGIS api for javascript——加入两个动态地图

    描述 这个示例表现如何加两个动态地图到一个地图.动态服务按用户缩放或平移服务器每次绘制的地图,ArcGISDynamicMapServiceLayer表示ArcGIS JavaScript API动态 ...

  3. iOS framework配置脚本

    # Sets the target folders and the final framework product. FMK_NAME=HovnVoipEngine FMK_VERSION=1.0 # ...

  4. Qt 5.3 下OpenCV 2.4.11 开发(0)图像处理基本概念

    1.普通情况下的RGB彩色图像:它的每一个像素点都是由三个通道组成,即红色(R).绿色(G)和蓝色(B).8位三通道彩色图像就是每一个像素中每一个通道的取值范围都是 0~255(即二进制下的8位数), ...

  5. 【Cocos2d-x 3.0】游戏开发之win32配置环境搭建project

    作者:Senlern 转载请注明,原文链接:http://blog.csdn.net/zhang429350061/article/details/37958275 非常久没有写教程了.如今认为还是要 ...

  6. HDU 1512 左偏树+并查集

    思路: 左偏树里面掺了一些并查集的应用 这里放一份左偏树的代码模板 重点就是merge函数了-- int merge(int k1,int k2){ if(!k1||!k2)return k1+k2; ...

  7. 【实用篇】获取Android通讯录中联系人信息

    第一步,在Main.xml布局文件中声明一个Button控件,布局文件代码如下: <LinearLayout xmlns:android="http://schemas.android ...

  8. display,visibility,meta知识

    <div style="display:">显示</div><div style="display:none;">隐藏不占位 ...

  9. Visual studio 之常见编译错误(1):syntax error : missing ';' before identifier 'PVOID64'

    来自博客:http://blog.csdn.net/chenyusiyuan/article/details/4643313的总结: 一般可通过调整 DirectShow/Include 在 Tool ...

  10. Python正则表达式初识(一)

    首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式.正则表达式在处理字符串的时候扮演着非常重要的角色,在网络爬虫的时候也十分常用,大家可以把它学的简单一些,但是不能不 ...