- 浏览: 91506 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (148)
- 全文检索 (1)
- java (29)
- xml (2)
- json (2)
- redis springmvc (1)
- Redis (5)
- 开发常识 (1)
- tomcat (2)
- 单元测试Junit (2)
- 设计模式 (2)
- spring (10)
- jvm (2)
- eclipse (4)
- echart (1)
- mybatis (1)
- mysql (3)
- web (1)
- js (2)
- PL/SQL (2)
- 其他 (1)
- 人生 (1)
- 安全 (2)
- jsp (2)
- 硬件电脑 (1)
- linux (3)
- git (10)
- oracle (8)
- ant (1)
- maven (2)
- 正则表达式 (2)
- chrome (1)
- 面试 (6)
- 多线程 (19)
- bug (11)
- java工具类 (3)
- 算法 (1)
- bug,git (1)
- shell (2)
- springmvc (2)
- Java8 (1)
- 消息队列-rocketmq (1)
- es (1)
- dubbo (0)
- spring cloud (0)
- hashmap (0)
- springboot (1)
- velocity (0)
package com.jbx.com; /** * @author Administrator * @date 2018-7-10下午09:54:20 * @todo 声明继承Thread类的奇数/偶数序列线程 * 本例演示通过继承Thread类设计线程。 * 以下声明线程类NumberThread继承Thread类,提供输出一个奇数(或偶数)序列的run()方法 * 序列初值由成员变量first设置 */ public class NumberThread extends Thread{ private int first; public NumberThread(String name,int first){ super(name); this.first = first; } public NumberThread(String name){ this(name, 0); } public void run(){ //线程体,覆盖Thread的run() System.out.print("\n"+this.getName()+": "); for(int i=first;i<50;i+=2){ System.out.print(i+" "); } System.out.println(this.getName()+"结束! "); } public static void main(String[] args) { System.out.println("currentThread="+Thread.currentThread().getName());//输出当前线程对象 NumberThread thread_odd = new NumberThread("奇数线程", 1);//创建线程对象 NumberThread thread_even = new NumberThread("偶数序列", 2); thread_odd.start(); //启动线程对象 thread_even.start(); System.out.println("activeCount="+thread_even.activeCount());//输出当前活动线程数 } }
其中run()方法覆盖Thread类的run()方法,提供线程执行的线程体。
程序运行结果是变化的,这里展示其中几种运行结果
情况一:
currentThread=main
activeCount=3
奇数线程: 1
偶数序列: 3 2 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 奇数线程结束!
4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 偶数序列结束!
情况二:
currentThread=main
activeCount=3
偶数序列: 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 偶数序列结束!
奇数线程: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 奇数线程结束!
情况三:
currentThread=main
奇数线程: activeCount=3
偶数序列: 2 4 6 8 10 1 3 5 7 9 11 13 15 12 17 14 19 16 21 18 23 20 25 22 27 24 29 26 31 28 33 30 35 32 37 34 39 36 41 38 43 40 45 42 47 44 49 46 奇数线程结束!
48 偶数序列结束!
程序设计说明如下:
1.main线程
一个运行Java程序的进程,默认首先启动执行的线程是main。在main()方法中创建了两个线程对象thread_odd、thread_even,调用start()方法启动这两个线程对象后,分别执行各自run()方法中的线程体,输出一个数据序列。此时,进程中包含了3个线程在并发地执行,如图所示
2.线程执行
在main()方法中,先启动两个线程对象,再输出activeCount;而运行结果则是,先输出activeCount 值为3,才输出两个数据序列。这说明,main线程先于其他线程执行,main线程执行后,才执行其他线程。
线程启动语句的顺序不能决定线程执行次序。线程启动后处于就绪状态,等待操作系统调度执行,线程何时执行、线程执行次序以及是否被打断均不由程序控制。如果线程执行时间过长或其他原因,线程执行将被中断,等待再次调度执行。因此,线程的运行结果具有不确定性。本例,当输出序列较长时,奇数线程和偶数线程交替运行,交替输出序列值。
思考:
按以下要求调整程序,观察不同的运行结果
1.将序列长度缩短至线程不被打断
2.在main()方法中输出较长数据序列后,再启动奇数线程和偶数线程
3.将序列长度增长至线程被多次打断
情况2 说明一下
加一个序列,此时main线程一直运行,看下图
public static void main(String[] args) { System.out.println("currentThread="+Thread.currentThread().getName());//输出当前线程对象 for(int i = 0;i<1000000000;i++){ System.out.print(i+" "); } NumberThread thread_odd = new NumberThread("奇数线程", 1);//创建线程对象 NumberThread thread_even = new NumberThread("偶数序列", 2); thread_odd.start(); //启动线程对象 thread_even.start(); System.out.println("activeCount="+thread_even.activeCount());//输出当前活动线程数 } }
通过java自带检测命令jvisualvm 查看结果图如下:
也可以通过java自带的jconsole命令查看线程的情况
发表评论
-
ThreadPoolExecutor线程池参数详解
2019-01-09 00:06 478参考:https://www.cnblogs.com/wayt ... -
解决线程同步问题的思路
2018-07-31 16:35 418线程同步机制 操作系统中实现线程同步有一种工 ... -
发送线程与接收线程 速率一致
2018-08-07 09:17 384package com.jbx.xiezuo; /* ... -
线程间的协作关系与线程同步
2018-07-30 16:21 5291.线程间的协作关系 当一个进程中的多个线程为完成同 ... -
带互斥锁的并发线程执行流程
2018-07-30 12:38 449... -
线程间的竞争关系与线程互斥
2018-07-30 11:19 672线程间的竞争关系与线 ... -
线程的同步机制
2018-07-17 11:31 385线程的同步机制 (一) ... -
3个线程,A,B,C,这三个线程分别只能打印 “a”,“b”,“c”,怎么让这三个线程依次打印“abc"
2018-07-17 11:19 351package com.jbx.thread; /* ... -
定时器与图形动画设计
2018-07-17 11:15 0动画(animation) 都是利用人眼的视 ... -
线程分类
2018-07-17 09:10 325线程分类: 线程可分为用户线程(user thread) ... -
线程优先级
2018-07-17 09:08 359Java提供10个等级的线程优先级,分别用1~10表示,优先级 ... -
设计滚动字演示线程状态及改变方法
2018-07-16 16:17 303本例演示线程对象的生 ... -
线程对象的生命周期
2018-07-16 11:28 361线程对象的生命周期 1.Thread.State类声明的线程状 ... -
声明实现Runnable接口的奇数/偶数序列线程
2018-07-11 14:02 428package com.jbx.thread; ... -
Java的线程对象Runnable接口和Thread类
2018-07-10 21:42 400Java支持内置的多线程机制。 Java语言包中的Runnab ... -
并发程序设计
2018-07-09 17:22 276并发程序设计 1.顺序程 ... -
线程介绍
2018-07-09 16:55 298线程 1.引入线程机制的 ... -
进程介绍
2018-07-09 15:38 378进程 进程的定义和属性 进程是一个可并发执行的 ... -
多线程
2018-07-09 14:31 313...
相关推荐
在Java编程语言中,创建多线程的方式主要有两种:继承`Thread`类和实现`Runnable`接口。这里我们将深入探讨标题所提及的“继承Thread类构造多线程实例”的方法。 1. **线程基础**: - **线程**是程序中的执行单元...
在本实例"JAVA100例之实例60 继承Thread实现多线程"中,我们将探讨如何通过继承Java内置的`Thread`类来创建并运行多个线程。 首先,让我们理解什么是线程。线程是程序中的执行流,每个线程都有自己的程序计数器、栈...
Java中的`Thread`类是实现多线程的核心类,通过创建并启动`Thread`对象,我们可以让程序并行运行不同的任务,从而提高程序的效率。本文将深入探讨如何使用`Thread`类来创建和启动新线程。 首先,让我们了解`Thread`...
自C++11标准发布以来,C++内置了对多线程的支持,提供了一个名为`<thread>`的库,其中包含了创建和管理线程的相关函数和类。核心类是`std::thread`,用于创建新的线程。例如: ```cpp #include <thread> void ...
请使用继承Thread类的方式定义两个线程,一个线程可以计算1--100所有数字的累加和,另一个线程可以计算1--1000所有数字的累加和,每个线程计算完毕后各自打印计算结果,格式例如:”xxx线程计算1--100的累加和,结果...
本文将深入探讨如何通过实现`Runnable`接口和继承`Thread`类两种方式来创建线程,并实现在屏幕上随机画正方形的程序。 首先,让我们了解线程的概念。线程是程序中的单一顺序控制流,一个进程可以包含多个线程,它们...
`Thread`类继承自`Object`类,它不仅可以直接被继承以创建线程,还可以通过实现`Runnable`接口的方式创建线程。在Android中,`HandlerThread`是`Thread`的一个直接子类,提供了额外的功能,如循环处理消息的能力。 ...
在Java中,创建和使用线程主要有两种方式,一种是继承Thread类,另一种是实现Runnable接口。这两种方式在使用上有一些区别,每种方式都有其特定的用法和特点。 首先,继承Thread类的方式。通过继承Thread类来创建...
【Java多线程-创建多线程的基本方式一:继承Thread类】 在Java编程中,多线程是一种并发执行任务的机制,它允许多个任务在同一时间运行,从而提高程序的效率和响应速度。Java提供了多种创建多线程的方式,其中最...
Java继承Thread类创建线程类示例 Java继承Thread类创建线程类是Java线程编程中的一种常见方法。通过继承Thread类,可以创建自定义的线程类,并重写run方法来实现线程的执行体。本文将通过实例形式,详细介绍Java...
创建一个新线程的基本步骤包括声明一个`std::thread`对象,然后通过传递一个函数或成员函数以及其参数来启动线程。下面是一个简单的例子: ```cpp #include #include <thread> void print_message(const std::...
可以通过实现Runnable接口或继承Thread类来创建线程。使用线程池(如ExecutorService)可以有效地管理大量并发线程,防止资源过度消耗。同步机制(如synchronized关键字、volatile变量和Lock接口)是解决线程安全...
// 声明控件 // 路径与线程数量 private EditText et_url, et_num; // 进度条 public static ProgressBar pb_thread; // 显示进度的操作 private TextView tv_pb; // 线程的数量 public static int ...
继承Thread类: 1必须重写run 方法:里面放置的实际的线程体 2 启动线程: 3创建Thread对象 4调用Thread对象的start 方法启动线程
创建线程的最常见方式是继承`Thread`类,并重写它的`run()`方法。`run()`方法包含了线程要执行的任务代码。例如: ```java public class MyThread extends Thread { @Override public void run() { // 这里编写...
基于JAVA的多线程实现方法-继承Thread类,将需要实现多线程的类声明为继承Thread类,覆盖其run()方法,并将线程体放在该方法里。
在上述示例中,我们定义了一个简单的线程函数`threadFunction`,并通过`std::thread`构造函数创建了一个线程。调用`t.join()`确保主线程等待新创建的线程执行完毕后才继续执行。 ### 二、线程的终止 #### 2.1 使用...
Java.lang.Thread类提供了创建和管理线程的方法。以下是一个简单的Java线程示例: ```java public class MyThread extends Thread { public void run() { // 线程执行的代码 } public static void main(String...
5. 声明并编写线程函数,注意只能有一个参数,且函数的返回值类型也是固定的;函数名可以自定义; DWORD WINAPI ThreadFun(LPVOID pthread);//线程入口函数 6. 在启动按钮的消息处理函数中编写如下代码: thread1....
Java 线程使用同步锁交替执行打印奇数偶数的方法 在 Java 中,多线程编程是非常重要的一部分,特别是在需要并发执行多个任务时。然而,在多线程编程中,如何保证线程执行结果的一致性是非常重要的。本文主要介绍了 ...