广告
返回顶部
首页 > 资讯 > 精选 >Java线程对象怎么理解
  • 258
分享到

Java线程对象怎么理解

2023-06-17 13:06:57 258人浏览 八月长安
摘要

这篇文章主要讲解了“Java线程对象怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程对象怎么理解”吧!线程的并发与并行在单CPU系统中,系统调度在某一时刻只能让一个线程运行

这篇文章主要讲解了“Java线程对象怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程对象怎么理解”吧!

线程的并发与并行

在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。

在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储如并发和并行这类术语,但我以我的经验能通俗地告诉大家它是怎么一回事,如果您看到我说的一些"标准"文档上说的不一样,只要意思一致,那您就不要挑刺了。

JAVA线程对象

现在我们来开始考察JAVA中线程对象。

在JAVA中,要开始一个线程,有两种方式。一是直接调用Thread实例的start()方法,二是

将Runable实例传给一个Thread实例然后调用它的start()方法。

在前面已经说过,线程对象和线程是两个完全不同的概念。这里我们再次深入一下,生成一个线程的实例,并不代表启动了线程。而启动线程是说在某个线程对象上启动了该实例对应的线程,当该线程结束后,并不会就立即消失。

对于从很多书籍上可以看到的基础知识我就不用多说了。既然是基础知识,我也着重于从普通文档上读不到的内容。所以本节我重点要说的是两种线程对象产生线程方式的区别。

class MyThread extends Thread{   public int x = 0;   public void run(){  for(int i=0;i<100;i++){    try{  Thread.sleep(10);    }catch(Exception e){}    System.out.println(x++);  }   }  }

如果我们生成MyThread的一个实例,然后调用它的start()方法,那么就产生了这个实例对应的线程:

public class Test {   public static void main(String[] args) throws Exception{  MyThread mt = new MyThread();  mt.start();   }  }

不用说,最终会打印出0到99,现在我们稍微玩一点花样:

public class Test {   public static void main(String[] args) throws Exception{  MyThread mt = new MyThread();  mt.start();  System.out.println(101);   }  }

也不用说,在基础篇(一)中我们知道由于单CPU的原因,一般会先打印101,然后打印0到99。不过我们可以控制线程让它按我们的意思来运行:

public class Test {   public static void main(String[] args) throws Exception{  MyThread mt = new MyThread();  mt.start();  mt.join();  System.out.println(101);   }  }

好了,我们终于看到,mt实例对应的线程(假如我有时说mt线程请你不要怪我,不过我尽量不这么说)。在运行完成后,主线程才打印101。因为我们让当前线程(这里是主线程)等待mt线程的运行结束。"在线程对象a上调用join()方法,就是让当前正在执行的线程等待线程对象a对应的线程运行完成后才继续运行。" 请大家一定要深刻理解并熟记这句话,而我这里引出这个知识点的目的是为了让你继续看下面的例子:

public class Test {   public static void main(String[] args) throws Exception{  MyThread mt = new MyThread();  mt.start();  mt.join();  Thread.sleep(3000);  mt.start();   }  }

当线程对象mt运行完成后,我们让主线程休息一下,然后我们再次在这个线程对象上启动线程。结果我们看到:

Exception in thread "main" java.lang.IllegalThreadStateException

也就是这种线程对象一时运行一次完成后,它就再也不能运行第二次了。我们可以看一下它有具体实现:

public synchronized void start() {   if (started)  throw new IllegalThreadStateException();  started = true;  group.add(this);  start0();   }

一个Thread的实例一旦调用start()方法,这个实例的started标记就标记为true,事实中不管这个线程后来有没有执行到底,只要调用了一次start()就再也没有机会运行了,这意味着:

通过Thread实例的start(),一个Thread的实例只能产生一个线程

那么如果要在一个实例上产生多个线程(也就是我们常说的线程池),我们应该如何做呢?这就是Runnable接口给我们带来的伟大的功能。

class R implements Runnable{   private int x = 0;   public void run(){  for(int i=0;i<100;i++){    try{  Thread.sleep(10);    }catch(Exception e){}    System.out.println(x++);  }   }  }

正如它的名字一样,Runnable的实例是可运行的,但它自己并不能直接运行,它需要被Thread对象来包装才行运行:

public class Test {   public static void main(String[] args) throws Exception{  new Thread(new R()).start();   }  }

当然这个结果和mt.start()没有什么区别。但如果我们把一个Runnable实例给Thread对象多次包装,我们就可以看到它们实际是在同一实例上启动线程:

public class Test {   public static void main(String[] args) throws Exception{  R r = new R();  for(int i=0;i<10;i++)    new Thread(r).start();   }  }

x是实例对象,但结果是x被加到了999,说明这10个线程是在同一个r对象上运行的。请大家注意,因为这个例子是在单CPU上运行的,所以没有对多个线程同时操作共同的对象进行同步。这里是为了说明的方便而简化了同步,而真正的环境中你无法预知程序会在什么环境下运行,所以一定要考虑同步。

到这里我们做一个完整的例子来说明线程产生的方式不同而生成的线程的区别:

package debug;  import java.io.*;  import java.lang.Thread;  class MyThread extends Thread{   public int x = 0;   public void run(){  System.out.println(++x);   }  }  class R implements Runnable{   private int x = 0;   public void run(){  System.out.println(++x);   }  }  public class Test {   public static void main(String[] args) throws Exception{  for(int i=0;i<10;i++){    Thread t = new MyThread();    t.start();  }  Thread.sleep(10000);//让上面的线程运行完成  R r = new R();  for(int i=0;i<10;i++){    Thread t = new Thread(r);    t.start();  }   }  }

感谢各位的阅读,以上就是“Java线程对象怎么理解”的内容了,经过本文的学习后,相信大家对Java线程对象怎么理解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java线程对象怎么理解

本文链接: https://www.lsjlt.com/news/289174.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java线程对象怎么理解
    这篇文章主要讲解了“Java线程对象怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程对象怎么理解”吧!线程的并发与并行在单CPU系统中,系统调度在某一时刻只能让一个线程运行...
    99+
    2023-06-17
  • 怎么创建Java线程对象
    本篇内容介绍了“怎么创建Java线程对象”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!默认情况下,主线程和垃圾回收线程都是由系统创建的,但是...
    99+
    2023-06-02
  • Java编程中的面向对象怎么理解
    本篇内容主要讲解“Java编程中的面向对象怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java编程中的面向对象怎么理解”吧!许多人刚刚学完现在看来是快要淘汰的只是面向过程的语言。他们的...
    99+
    2023-06-17
  • Java中怎么创建自己的线程对象
    本篇内容主要讲解“Java中怎么创建自己的线程对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中怎么创建自己的线程对象”吧!默认情况下,主线程和垃圾回收线程都是由系统创建的,但是我们需...
    99+
    2023-06-02
  • Java一切都是对象怎么理解
    这篇文章主要介绍“Java一切都是对象怎么理解”,在日常操作中,相信很多人在Java一切都是对象怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java一切都是对象怎么理解”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-03
  • 怎么理解Java面向对象概念
    这篇文章主要讲解了“怎么理解Java面向对象概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java面向对象概念”吧!Java作为构建编程语言的核心基础,已经得到了越来越多人的青睐...
    99+
    2023-06-02
  • Java多线程怎么理解
    本文小编为大家详细介绍“Java多线程怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java多线程怎么理解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 线程池的优势总体来说,线程池有如下的优势:(1...
    99+
    2023-07-05
  • 怎么理解java图的对象化描述
    这篇文章主要讲解了“怎么理解java图的对象化描述”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解java图的对象化描述”吧!一、前言对于图来说,我一直以来都似懂非懂懂的是图的含义,不...
    99+
    2023-06-25
  • 怎么理解ES6对象
    这篇文章主要讲解了“怎么理解ES6对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解ES6对象”吧!对象字面量属性的简洁表示法ES6允许对象的属性直...
    99+
    2022-10-19
  • JavaScript对象怎么理解
    这篇文章主要介绍“JavaScript对象怎么理解”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript对象怎么理解”文章能帮助大家解决问题。 &nb...
    99+
    2022-10-19
  • Java多线程之条件对象Condition
    目录1 简介2 Condition的实现分析等待队列等待(await):AbstractQueuedLongSynchronizer中实现Condition等待通知的本质通知(sig...
    99+
    2022-11-12
  • 理解Java面向对象编程设计
    目录1 前言2 结构化程序设计3 面向对象编程设计4 码农洞见4.1 两种编程范式之间的区别4.2 两种编程范式之间的联系1 前言 计算机革命的起源来自机器。编程语言就像是那台机器。...
    99+
    2022-11-12
  • Java线程不同步的现象怎么解决
    本篇内容主要讲解“Java线程不同步的现象怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程不同步的现象怎么解决”吧!线程的安排毕竟是随机的,很少会有不同步的出现,次数少了不容易...
    99+
    2023-06-03
  • 怎么理解Java面向对象三大特性
    这篇文章主要讲解了“怎么理解Java面向对象三大特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java面向对象三大特性”吧!继承Java中的继承只能单继承,但是可以通过内部类继承...
    99+
    2023-06-02
  • 怎么理解ES6 Promise对象
    这篇文章主要讲解了“怎么理解ES6 Promise对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解ES6 Promise对象”吧!概述是异步编程的...
    99+
    2022-10-19
  • 怎么理解JavaScript json对象
    本篇文章为大家展示了怎么理解JavaScript json对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 一、对象的语法JSON 对象被大括号环绕 {...
    99+
    2022-10-19
  • 使用C语言怎么对线程对象和线程进行存储
    使用C语言怎么对线程对象和线程进行存储?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C...
    99+
    2023-06-08
  • java对象实例化过程中的多态特性怎么理解
    本篇内容主要讲解“java对象实例化过程中的多态特性怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java对象实例化过程中的多态特性怎么理解”吧!java 对象实例化过程中的多态特性执行...
    99+
    2023-06-21
  • java 线程之对象的同步和异步(实例讲解)
    一、多线程环境下的同步与异步同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去。package com.jalja.org.thread.demo01;public cla...
    99+
    2023-05-31
    java 线程 同步
  • 怎么理解Python中的面向对象编程
    本篇内容主要讲解“怎么理解Python中的面向对象编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Python中的面向对象编程”吧!Python支持多种类型的编程范式,例如过程式编程、...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作