一·【概念】

      一般来说,我们把正在计算机中运行的程序叫做“进程”(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. caioj 1076 动态规划入门(中链式3:最大的算式)

    一开始写了一个复杂度很大的方法,然后还过了(千万记得开longlong ) #include<cstdio> #include<cstring> #include<alg ...

  2. 今日SGU 5.26

    #include<bits/stdc++.h> #define de(x) cout<<#x<<"="<<x<<endl ...

  3. unity 5.6.1 Oculus手柄输入问题

    unity文档中提到 轴的 ID 是5和6,但是测试后发现,ID是6和7,很坑 void Update () { if (Input.GetKeyDown(KeyCode.JoystickButton ...

  4. 特定位取反(js实现)

    去华为面试的时候.没有做好准备工作.面试的流程没有问清也没有查,结果一过去就让上机做题,着实有点措手不及.笔者是擅长前端的Java Webproject师啊,主要的底层编程知识早已生疏了.机试题碰到了 ...

  5. IOS-7-纪念一下刚刚接到的第一份offer(下面是面试遇到的问题)

    1.多线程技术 有四种开启线程的方式,基本的为:NSThread.NSOperation.GCD:还有一种已经老掉牙了.基于C语言.就不写了,基本不用. 样例:家在网络图片显示在手机界面上 第一步:代 ...

  6. Visual Studio Code Setup

    Windows https://code.visualstudio.com/docs/setup/windows Additional Components and Tools https://cod ...

  7. decimal.ToString("#0.00")与decimal.ToString("#.##")的区别

    decimal decTemp = 2.1m; Console.WriteLine(decTemp.ToString("#0.00")); //输出2.10 Console.Wri ...

  8. Sub Thread to update main Thread (UI)

    Sub Thread to update main Thread (UI) main Thread :   A  has Hander.HandleMessage() to process the & ...

  9. 简单STL笔记

    想了好久,还是把自己了解的先整理一下吧,毕竟老是忘,这里主要简单介绍三种容器 set,queue,vector,以及栈 stack,队列queue 的简单用法.一.set 在set中,效率比vecto ...

  10. make---GNU编译工具

    make命令是GNU的工程化编译工具,用于编译众多相互关联的源代码问价,以实现工程化的管理,提高开发效率. 知识扩展 无论是在linux 还是在Unix环境 中,make都是一个非常重要的编译命令.不 ...