我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java线程对象怎么理解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java线程对象怎么理解

这篇文章主要讲解了“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线程对象怎么理解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java线程对象怎么理解

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

下载Word文档

猜你喜欢

Java线程对象怎么理解

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

怎么创建Java线程对象

本篇内容介绍了“怎么创建Java线程对象”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!默认情况下,主线程和垃圾回收线程都是由系统创建的,但是
2023-06-02

Java编程中的面向对象怎么理解

本篇内容主要讲解“Java编程中的面向对象怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java编程中的面向对象怎么理解”吧!许多人刚刚学完现在看来是快要淘汰的只是面向过程的语言。他们的
2023-06-17

Java中怎么创建自己的线程对象

本篇内容主要讲解“Java中怎么创建自己的线程对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中怎么创建自己的线程对象”吧!默认情况下,主线程和垃圾回收线程都是由系统创建的,但是我们需
2023-06-02

Java一切都是对象怎么理解

这篇文章主要介绍“Java一切都是对象怎么理解”,在日常操作中,相信很多人在Java一切都是对象怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java一切都是对象怎么理解”的疑惑有所帮助!接下来,请跟
2023-06-03

Java多线程怎么理解

本文小编为大家详细介绍“Java多线程怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java多线程怎么理解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 线程池的优势总体来说,线程池有如下的优势:(1
2023-07-05

怎么理解Java面向对象概念

这篇文章主要讲解了“怎么理解Java面向对象概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java面向对象概念”吧!Java作为构建编程语言的核心基础,已经得到了越来越多人的青睐
2023-06-02

怎么理解java图的对象化描述

这篇文章主要讲解了“怎么理解java图的对象化描述”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解java图的对象化描述”吧!一、前言对于图来说,我一直以来都似懂非懂懂的是图的含义,不
2023-06-25

Java线程不同步的现象怎么解决

本篇内容主要讲解“Java线程不同步的现象怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程不同步的现象怎么解决”吧!线程的安排毕竟是随机的,很少会有不同步的出现,次数少了不容易
2023-06-03

怎么理解Java面向对象三大特性

这篇文章主要讲解了“怎么理解Java面向对象三大特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java面向对象三大特性”吧!继承Java中的继承只能单继承,但是可以通过内部类继承
2023-06-02

使用C语言怎么对线程对象和线程进行存储

使用C语言怎么对线程对象和线程进行存储?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C
2023-06-08

Java线程的锁对象Lock同步问的处理方式

本篇内容介绍了“Java线程的锁对象Lock同步问的处理方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lock是java.util.co
2023-05-30

java对象实例化过程中的多态特性怎么理解

本篇内容主要讲解“java对象实例化过程中的多态特性怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java对象实例化过程中的多态特性怎么理解”吧!java 对象实例化过程中的多态特性执行
2023-06-21

java 线程之对象的同步和异步(实例讲解)

一、多线程环境下的同步与异步同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去。package com.jalja.org.thread.demo01;public cla
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录