- 浏览: 1336146 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
系统在运行时,有时候我们要控制它同时允许多少个线程运行,如果太多可能引起内存溢出之类的异常,所以在线程比较多的情况下我们可以控制它的最大线程数,这样系统可以在一种比较稳定的状态下运行。下面是一个简单实现,可以少加修改用在系统中去。
package thread; public class CreateThread { public static void main(String[] args) throws InterruptedException { //比如我们现要创建30个子线程,但允许最大线程数为10 for (int i = 0; i < 30; i++) { // 获取锁资源 synchronized (SubThread.class) { int tCount = SubThread.getThreadCounts(); // 如果入库线程达到了最大允许的线程数 while (tCount >= 10) { System.out.println("系统当前线程数为:" + tCount + ",已达到最大线程数 10,请等待其他线程执行完毕并释放系统资源"); // 释放锁,等待“线程数”资源,等待其他入库线程执行完毕 SubThread.class.wait(); /* * 带条件的wait()(即放在条件语句执行的wait()方法),一定要放在while * 条件里执行,因为被唤醒之后该线程有可能不会马上执行,只是把当前线程从等 * 待池中放入对象锁池队列中,直到获取到锁后才开始运行。所以在同步块里wait方 * 法前后的代码块不是原子性的,会分开执行,但sleep()不同,睡时不会释放锁。 * 所以等到执行时,可能条件已被其他的线程给改变了(像这里的最大线程数),此 * 时就需要再此判断该条件,否则条件可能不成立了 */ tCount = SubThread.getThreadCounts(); } // 重新启动一个子线程 Thread td = new SubThread(); td.start(); System.out.println("已创建新的子线程: " + td.getName()); } } } }
package thread; public class SubThread extends Thread { // 线程计数器 static private int threadCounts; // 线程名称池 static private String threadNames[]; static { // 假设这里允许系统同时运行最大线程数为10个 int maxThreadCounts = 10; threadNames = new String[maxThreadCounts]; // 初始化线程名称池 for (int i = 1; i <= maxThreadCounts; i++) { threadNames[i - 1] = "子线程_" + i; } } public SubThread() { // 临界资源锁定 synchronized (SubThread.class) { // 线程总数加1 threadCounts++; // 从线程名称池中取出一个未使用的线程名 for (int i = 0; i < threadNames.length; i++) { if (threadNames[i] != null) { String temp = threadNames[i]; // 名被占用后清空 threadNames[i] = null; // 初始化线程名称 this.setName(temp); break; } } } } public void run() { System.out.println("-->>" + this.getName() + "开始运行"); try { //模拟程序耗时 Thread.sleep(1000); // ... } catch (Exception e) { System.out.println(e); } finally { synchronized (SubThread.class) { // 线程运行完毕后减1 threadCounts--; // 释放线程名称 String[] threadName = this.getName().split("_"); // 线程名使用完后放入名称池 threadNames[Integer.parseInt(threadName[1]) - 1] = this.getName(); /* * 通知其他被阻塞的线程,但如果其他线程要执行,则该同步块一定要运行结束(即直 * 到释放占的锁),其他线程才有机会执行,所以这里的只是唤醒在此对象监视器上等待 * 的所有线程,让他们从等待池中进入对象锁池队列中,而这些线程重新运行时它们一定 * 要先要得该锁后才可能执行,这里的notifyAll是不会释放锁的,试着把下面的睡眠语 * 句注释去掉,即使你已调用了notify方法,发现CreateThread中的同步块还是好 * 像一直处于对象等待状态,其实调用notify方法后,CreateThread线程进入了对象锁 * 池队列中了,只要它一获取到锁,CreateThread所在线程就会真真的被唤醒并运行。 */ SubThread.class.notifyAll(); // try { // Thread.sleep(10000); // } catch (InterruptedException e) { // e.printStackTrace(); // } System.out.println("----" + this.getName() + " 所占用资源释放完毕,当前系统正在运行的子线程数:" + threadCounts); } System.out.println("<<--" + this.getName() + "运行结束"); } } static public int getThreadCounts() { synchronized (SubThread.class) { return threadCounts; } } }
某次运行结果:
已创建新的子线程: 子线程_1
已创建新的子线程: 子线程_2
已创建新的子线程: 子线程_3
-->>子线程_2开始运行
已创建新的子线程: 子线程_4
-->>子线程_4开始运行
已创建新的子线程: 子线程_5
已创建新的子线程: 子线程_6
-->>子线程_6开始运行
已创建新的子线程: 子线程_7
已创建新的子线程: 子线程_8
已创建新的子线程: 子线程_9
已创建新的子线程: 子线程_10
系统当前线程数为:10,已达到最大线程数 10,请等待其他线程执行完毕并释放系统资源
-->>子线程_1开始运行
-->>子线程_8开始运行
-->>子线程_10开始运行
-->>子线程_3开始运行
-->>子线程_5开始运行
-->>子线程_7开始运行
-->>子线程_9开始运行
----子线程_2 所占用资源释放完毕,当前系统正在运行的子线程数:9
已创建新的子线程: 子线程_2
系统当前线程数为:10,已达到最大线程数 10,请等待其他线程执行完毕并释放系统资源
<<--子线程_2运行结束
-->>子线程_2开始运行
----子线程_4 所占用资源释放完毕,当前系统正在运行的子线程数:9
<<--子线程_4运行结束
已创建新的子线程: 子线程_4
系统当前线程数为:10,已达到最大线程数 10,请等待其他线程执行完毕并释放系统资源
-->>子线程_4开始运行
----子线程_6 所占用资源释放完毕,当前系统正在运行的子线程数:9
<<--子线程_6运行结束
----子线程_10 所占用资源释放完毕,当前系统正在运行的子线程数:8
<<--子线程_10运行结束
----子线程_8 所占用资源释放完毕,当前系统正在运行的子线程数:7
<<--子线程_8运行结束
已创建新的子线程: 子线程_6
已创建新的子线程: 子线程_8
已创建新的子线程: 子线程_10
系统当前线程数为:10,已达到最大线程数 10,请等待其他线程执行完毕并释放系统资源
----子线程_1 所占用资源释放完毕,当前系统正在运行的子线程数:9
<<--子线程_1运行结束
-->>子线程_6开始运行
-->>子线程_10开始运行
已创建新的子线程: 子线程_1
----子线程_7 所占用资源释放完毕,当前系统正在运行的子线程数:9
<<--子线程_7运行结束
----子线程_9 所占用资源释放完毕,当前系统正在运行的子线程数:8
<<--子线程_9运行结束
-->>子线程_8开始运行
-->>子线程_1开始运行
----子线程_5 所占用资源释放完毕,当前系统正在运行的子线程数:7
<<--子线程_5运行结束
----子线程_3 所占用资源释放完毕,当前系统正在运行的子线程数:6
<<--子线程_3运行结束
已创建新的子线程: 子线程_3
已创建新的子线程: 子线程_5
-->>子线程_5开始运行
已创建新的子线程: 子线程_7
已创建新的子线程: 子线程_9
系统当前线程数为:10,已达到最大线程数 10,请等待其他线程执行完毕并释放系统资源
-->>子线程_9开始运行
-->>子线程_3开始运行
-->>子线程_7开始运行
----子线程_4 所占用资源释放完毕,当前系统正在运行的子线程数:9
<<--子线程_4运行结束
----子线程_8 所占用资源释放完毕,当前系统正在运行的子线程数:8
<<--子线程_8运行结束
----子线程_1 所占用资源释放完毕,当前系统正在运行的子线程数:7
<<--子线程_1运行结束
已创建新的子线程: 子线程_1
已创建新的子线程: 子线程_4
-->>子线程_4开始运行
已创建新的子线程: 子线程_8
-->>子线程_1开始运行
-->>子线程_8开始运行
----子线程_5 所占用资源释放完毕,当前系统正在运行的子线程数:9
<<--子线程_5运行结束
已创建新的子线程: 子线程_5
----子线程_2 所占用资源释放完毕,当前系统正在运行的子线程数:9
<<--子线程_2运行结束
----子线程_6 所占用资源释放完毕,当前系统正在运行的子线程数:8
<<--子线程_6运行结束
-->>子线程_5开始运行
----子线程_10 所占用资源释放完毕,当前系统正在运行的子线程数:7
<<--子线程_10运行结束
----子线程_9 所占用资源释放完毕,当前系统正在运行的子线程数:6
<<--子线程_9运行结束
已创建新的子线程: 子线程_2
已创建新的子线程: 子线程_6
已创建新的子线程: 子线程_9
已创建新的子线程: 子线程_10
系统当前线程数为:10,已达到最大线程数 10,请等待其他线程执行完毕并释放系统资源
-->>子线程_6开始运行
-->>子线程_10开始运行
----子线程_3 所占用资源释放完毕,当前系统正在运行的子线程数:9
已创建新的子线程: 子线程_3
系统当前线程数为:10,已达到最大线程数 10,请等待其他线程执行完毕并释放系统资源
<<--子线程_3运行结束
----子线程_7 所占用资源释放完毕,当前系统正在运行的子线程数:9
已创建新的子线程: 子线程_7
<<--子线程_7运行结束
-->>子线程_2开始运行
-->>子线程_9开始运行
-->>子线程_7开始运行
-->>子线程_3开始运行
----子线程_4 所占用资源释放完毕,当前系统正在运行的子线程数:9
<<--子线程_4运行结束
----子线程_1 所占用资源释放完毕,当前系统正在运行的子线程数:8
<<--子线程_1运行结束
----子线程_8 所占用资源释放完毕,当前系统正在运行的子线程数:7
<<--子线程_8运行结束
----子线程_5 所占用资源释放完毕,当前系统正在运行的子线程数:6
<<--子线程_5运行结束
----子线程_6 所占用资源释放完毕,当前系统正在运行的子线程数:5
<<--子线程_6运行结束
----子线程_10 所占用资源释放完毕,当前系统正在运行的子线程数:4
<<--子线程_10运行结束
----子线程_2 所占用资源释放完毕,当前系统正在运行的子线程数:3
<<--子线程_2运行结束
----子线程_7 所占用资源释放完毕,当前系统正在运行的子线程数:2
<<--子线程_7运行结束
----子线程_9 所占用资源释放完毕,当前系统正在运行的子线程数:1
<<--子线程_9运行结束
----子线程_3 所占用资源释放完毕,当前系统正在运行的子线程数:0
<<--子线程_3运行结束
发表评论
-
Java正则表达式
2014-03-14 10:16 1759Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1453初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1245这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2179java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34789默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1635http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1540在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
Java断言(assert)—— 转
2010-06-20 10:36 12095一、概述 在C和C++语言中都有assert关键,表示断言。 ... -
eclipse调试
2010-06-04 00:11 8074eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2141Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3668最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2416类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1050用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 18737内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 8973中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3371关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4708定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2303线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9802import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2416final关键字 先看看final关键字,它可以被用于以下几个 ...
相关推荐
Java线程是多任务编程的重要概念,特别是在大型的、复杂的软件系统中,它允许程序同时执行多个不同的任务,提升程序的并发性和效率。本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在...
Java线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)来管理和调度。理解并熟练掌握Java线程的创建、控制以及...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承Thread类或者实现Runnable接口。本示例可能是一个Applet,Applet是Java小...
在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型简化了程序设计,降低了程序复杂度,使得开发者可以更专注于...
这个压缩包中的文件提供了几个关于Java多线程交互的实例,可以帮助我们深入理解如何在并发环境中控制线程的同步,确保数据的一致性和安全性。 首先,让我们讨论一下标题和描述中提到的关键概念——“多线程交互”和...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,提升系统效率。在处理耗时操作如大文件下载、数据处理或网络请求时,展示进度条能够提供用户友好的交互体验,让使用者了解任务的完成状态。本主题...
在Java编程语言中,线程是程序执行的基本单元,它允许程序同时执行多个任务。Java提供了多种方式来创建和管理线程,使得并发编程变得相对简单。本篇将深入探讨Java中线程的简单处理。 首先,我们可以通过实现`...
【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...
在这个"Eclipse项目java线程实例"中,我们可以深入理解并实践Java线程的创建、管理和同步机制。 首先,Java线程允许程序同时执行多个不同的任务,从而提高系统的效率和响应性。Java提供了两种创建线程的方式:通过...
现在推荐的做法是在`run()`方法内通过设置一个标志位来控制线程的运行状态,从而达到优雅地终止线程的目的。 ```java if (thread1.isAlive()) { thread1.stop(); // 终止thread1 System.out.println("thread1已经...
#### 一、Java线程:概念与原理 现代操作系统都是多任务操作系统,其中多线程是一种重要的实现多任务的方式。线程是进程内的一个执行单位,一个进程可以包含多个线程。例如,在Java应用程序中(如`java.exe`),...
Java多线程是Java编程语言的重要特性之一,它允许开发者在单个程序中同时运行多个部分,这些部分可以并发执行。掌握Java多线程技术对于设计高效的并发程序、充分利用多核处理器资源、提高应用程序的执行效率至关重要...
3. **线程生命周期**:Java线程经历新建、就绪、运行、阻塞和终止五个状态。了解这些状态及其转换对于理解和控制线程行为至关重要。 4. **线程同步**:为了解决多线程环境下的数据安全问题,Java提供了synchronized...
#### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个进程拥有独立的内存空间。...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
Java线程、线程池和XML解析是Java编程中至关重要的三个概念,它们在实际开发中扮演着不可或缺的角色。下面将分别对这三个主题进行深入的介绍。 首先,我们来看Java线程。线程是程序执行的最小单位,一个进程可以...
### Java线程基础知识详解 #### 一、引言 随着计算机技术的发展,多核处理器已经成为了标配,这为多线程编程提供了强大的硬件支持。Java作为一种广泛应用的编程语言,在其设计之初便内置了对线程的支持,使得...
总之,理解并掌握Java中的线程安全问题及其解决方案是每个Java开发者必备的技能,这不仅可以确保程序的正确性,还能有效利用多核处理器,提升系统性能。在阅读源码时,也要注意观察作者如何处理线程安全,这对于提升...
Java 多线程是Java编程语言的一个重要特性,它使得程序能够在同一时间执行多个任务,从而提高系统效率和资源利用率。本文将深入探讨Java中的线程概念、创建线程的方式以及如何实现线程的并发执行。 1. 进程与线程 ...
- **主要内容**:本教程将从零开始介绍Java线程的基础知识,包括线程的概念、为何使用线程以及如何编写简单的多线程程序。此外,还将深入探讨更高级的主题,如线程间的通信机制、数据同步方法等。 #### 二、线程...