- 浏览: 612706 次
- 性别:
- 来自: 太原
文章分类
- 全部博客 (240)
- 程序员数学/线性代数(Linear Algebra) (2)
- 程序员数学/微积分(Calculus) (6)
- 机器学习(Machine Learning) (5)
- JAVA SE (63)
- JAVA EE (14)
- 数据库技术 (26)
- struts (4)
- 软件设计/设计模式 (0)
- ibatis (2)
- XML (4)
- 领域建模 (0)
- 数据资源共享 (1)
- 软件工程 (11)
- 技术以外 (6)
- 面向对象 (2)
- 科学数据共享 (1)
- 资源 (7)
- WEB2.0 (11)
- 电子商务 (10)
- 算法、数据结构、数学 (10)
- LAMP (1)
- 杂谈 (12)
- C语言 (7)
- 程序设计思想 (3)
- 读书和笔记 (1)
- 生活 健身 养生 (5)
- WEB UI (2)
- eclipse (2)
- 项目管理 (7)
- oracle (5)
- linux (1)
- webGIS (6)
最新评论
-
TimePower:
OK~终于明白了~~
参数(parameter)和属性(Attribute)的区别 -
OnTheRoad_lee:
不错,正式我想要的东西,一直不明白序列化是什么?有什么用?至此 ...
我对Java Serializable(序列化)的理解和总结 -
EchoZhouYou:
好久不上这,找这本书时发现这一篇,特意登录来赞一下
《程序设计语言——实践之路》读后感 -
yong7356:
学习一下Serializable
我对Java Serializable(序列化)的理解和总结 -
dengjm_2012:
写得不错!
我对Java Serializable(序列化)的理解和总结
Java的内置线程支持
关于Java好的方面是它有内置的写多线程的支持。Java的设计者知道多线程编程的价值,所以聪明决定在Java的核心部分就决定直接支持线程。在第7章“并发存取对象和变量”就阐述了在Java语言中,synchronized关键字如何被用来锁住对象和类来控制并发存取数据。Thread和ThreadGroup类就在java.lang包的核心API中。通过wait( ) notify( ) 方法的支持,Java中所有类的父类Object具有线程间通信的能力。即使当前操作系统不支持线程概念,一个写好的JVM也可以模拟多线程环境。在Java中,线程的支持不是事后的,而是从一开始设计时就包括进来的。
第2章:一个简单的两个线程例子
概述
这章展示了创建并在一个小的Java应用中运行线程是如何简单。第一个线程总是在由JVM创建的“main”线程,该线程开始运行程序。该主线程然后创建第二个线程。每个线程将在控制台打印各自信息,以此来证明他们好像以同步方式运行。
创建一个线程的步骤如下:
继承java.lang.thread类
在JVM中每个线程与java.lang.Thread类的一个实例相关联。这些Thread对象作为与底层操作系统线程交互的接口。通过该类中的方法,可以对线程进行开始,停止,中断,命名、设置优先级和查询有关线程当前状态等操作。
[b]注意:{/b]有两种方式可创建一个允许线程运行于其中的类。一种方式是继承Thread类;另一种是继承任意类并且实现Runnable接口。为了便于说明,继承Thread类是最简单的方法,本书开始就是用该方法。在实际中,实现Runnable接口可能工作地更好些。
在这个例子中,创建新线程的第一步是继承java.lang.Thread类:
TwoThread子类是一个(IS-A) Thread,继承了父类的protected 和public成员。TwoThread除了从父类中继承的其他行为之外,它还可以对线程进行开始、停止、中断、命名、设置优先级以及查询线程当前状态等操作。
重写run()方法
继承Thread类之后,下一步就是重写run()方法,因为Thread类中方法什么也没做:
Public void run() { }
当一个新线程开始运行,进入该线程的入口就是run()方法。run()中的第一条语句就是新线程执行的第一条语句。线程执行的每条语句都包含在run()方法中或包含在被run()方法直接或间接调用的其他方法中。从run()被调用之前到run()返回,新线程被认为是活着的。run()返回之后,线程就死掉了。当一个线程死了之后不能重新开始。
在本章的例子中,run()方法被重写为迭代10次并且每次打印New thread信息:
循环完成之后,线程从run()方法返回,然后安静死掉。
创建一个新线程 Spawning a New Thread
新线程从已经运行的线程来创建。首先,构造一个新Thread实例。在此例中,一个新TwoThread对象将正好,因为TwoThread IS-A Thread:
TwoThread tt = new TwoThread();
下一步是调用start()方法准备开始执行线程(start()从Thread继承而来):
tt.start();
start()调用后立即返回,不需要等待其他线程开始执行。在start()中,父线程异步地从JVM中给线程调度程序发出信号,告诉它只要它方便,其他线程可以开始执行了。在未来某个不可预期的时间里,其他线程将被激活,并调用Thread对象的run()方法(在该例中是指TwoThread中实现的重写方法run())。与此同时,原来的线程继续执行start()方法后面的语句。
两个线程并发、独立地运行。在一个多处理器的机器上,这两个线程可能在同一时刻真正都在运行,各自运行在自己的处理器上。
一个更常见的情况是只有一个处理器,JVM和OS共同工作在短时间调度每个线程。当其他线程被冻结,等待处理器的下一次机会时,每个线程就得到一次运行的机会。这种在线程之间的上下文切换是非常快的,给人一种同时执行的假象。
提示:一个新创建的线程可能在start()被调用之后的任何时间开始执行(进入run()方法)。这意味着start()方法之后的任何语句被执行之前,原来线程都可能被换出(swapped out)。
假如原来的线程正在执行下面的代码:
stmt1();
tt.start();
新线程有一个run()方法如下:
处理器中实际执行的语句顺序可能是stmt1(), tt.start(), stmt2(), stmtA(), and stmtB()。也可能是:stmt1(), tt.start(), stmtA(), stmtB(), and stmt2().也许还可能是另外一种顺序。
重要的是要记住:尽管每个线程将执行各自语句的顺序是已知和简单的,但是实际运行在处理器上的语句却是不确定的。对于程序的正确性而言,没有一种特殊的顺序可以依赖。
把所有放在一起
TwoThread.java, shown in Listing 2.1.
Listing 2.1 TwoThread.java—The Complete Code for the TwoThread Example
第一次运行的结果:
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
第二次运行的结果:
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
从以上结果可以看出来,每次运行的结果都不一样,你的机器上也可能不一样。
关于Java好的方面是它有内置的写多线程的支持。Java的设计者知道多线程编程的价值,所以聪明决定在Java的核心部分就决定直接支持线程。在第7章“并发存取对象和变量”就阐述了在Java语言中,synchronized关键字如何被用来锁住对象和类来控制并发存取数据。Thread和ThreadGroup类就在java.lang包的核心API中。通过wait( ) notify( ) 方法的支持,Java中所有类的父类Object具有线程间通信的能力。即使当前操作系统不支持线程概念,一个写好的JVM也可以模拟多线程环境。在Java中,线程的支持不是事后的,而是从一开始设计时就包括进来的。
第2章:一个简单的两个线程例子
概述
这章展示了创建并在一个小的Java应用中运行线程是如何简单。第一个线程总是在由JVM创建的“main”线程,该线程开始运行程序。该主线程然后创建第二个线程。每个线程将在控制台打印各自信息,以此来证明他们好像以同步方式运行。
创建一个线程的步骤如下:
- 继承java.lang.Thread类
- 在继承Thread的子类中重写run( )方法;
- 创建这个新类的实例
- 调用该实例的start( )方法
继承java.lang.thread类
在JVM中每个线程与java.lang.Thread类的一个实例相关联。这些Thread对象作为与底层操作系统线程交互的接口。通过该类中的方法,可以对线程进行开始,停止,中断,命名、设置优先级和查询有关线程当前状态等操作。
[b]注意:{/b]有两种方式可创建一个允许线程运行于其中的类。一种方式是继承Thread类;另一种是继承任意类并且实现Runnable接口。为了便于说明,继承Thread类是最简单的方法,本书开始就是用该方法。在实际中,实现Runnable接口可能工作地更好些。
在这个例子中,创建新线程的第一步是继承java.lang.Thread类:
public class TwoThread extends Thread { // ... }
TwoThread子类是一个(IS-A) Thread,继承了父类的protected 和public成员。TwoThread除了从父类中继承的其他行为之外,它还可以对线程进行开始、停止、中断、命名、设置优先级以及查询线程当前状态等操作。
重写run()方法
继承Thread类之后,下一步就是重写run()方法,因为Thread类中方法什么也没做:
Public void run() { }
当一个新线程开始运行,进入该线程的入口就是run()方法。run()中的第一条语句就是新线程执行的第一条语句。线程执行的每条语句都包含在run()方法中或包含在被run()方法直接或间接调用的其他方法中。从run()被调用之前到run()返回,新线程被认为是活着的。run()返回之后,线程就死掉了。当一个线程死了之后不能重新开始。
在本章的例子中,run()方法被重写为迭代10次并且每次打印New thread信息:
public void run() { for ( int i = 0; i < 10; i++ ) { System.out.println(“New thread”); } }
循环完成之后,线程从run()方法返回,然后安静死掉。
创建一个新线程 Spawning a New Thread
新线程从已经运行的线程来创建。首先,构造一个新Thread实例。在此例中,一个新TwoThread对象将正好,因为TwoThread IS-A Thread:
TwoThread tt = new TwoThread();
下一步是调用start()方法准备开始执行线程(start()从Thread继承而来):
tt.start();
start()调用后立即返回,不需要等待其他线程开始执行。在start()中,父线程异步地从JVM中给线程调度程序发出信号,告诉它只要它方便,其他线程可以开始执行了。在未来某个不可预期的时间里,其他线程将被激活,并调用Thread对象的run()方法(在该例中是指TwoThread中实现的重写方法run())。与此同时,原来的线程继续执行start()方法后面的语句。
两个线程并发、独立地运行。在一个多处理器的机器上,这两个线程可能在同一时刻真正都在运行,各自运行在自己的处理器上。
一个更常见的情况是只有一个处理器,JVM和OS共同工作在短时间调度每个线程。当其他线程被冻结,等待处理器的下一次机会时,每个线程就得到一次运行的机会。这种在线程之间的上下文切换是非常快的,给人一种同时执行的假象。
提示:一个新创建的线程可能在start()被调用之后的任何时间开始执行(进入run()方法)。这意味着start()方法之后的任何语句被执行之前,原来线程都可能被换出(swapped out)。
假如原来的线程正在执行下面的代码:
stmt1();
tt.start();
新线程有一个run()方法如下:
public void run() { stmtA(); stmtB(); } stmt2();
处理器中实际执行的语句顺序可能是stmt1(), tt.start(), stmt2(), stmtA(), and stmtB()。也可能是:stmt1(), tt.start(), stmtA(), stmtB(), and stmt2().也许还可能是另外一种顺序。
重要的是要记住:尽管每个线程将执行各自语句的顺序是已知和简单的,但是实际运行在处理器上的语句却是不确定的。对于程序的正确性而言,没有一种特殊的顺序可以依赖。
把所有放在一起
TwoThread.java, shown in Listing 2.1.
Listing 2.1 TwoThread.java—The Complete Code for the TwoThread Example
1: public class TwoThread extends Thread { 2: public void run() { 3: for ( int i = 0; i < 10; i++ ) { 4: System.out.println(“New thread”); 5: } 6: } 7: 8: public static void main(String[] args) { 9: TwoThread tt = new TwoThread(); 10: tt.start(); 11: 12: for ( int i = 0; i < 10; i++ ) { 13: System.out.println(“Main thread”); 14: } 15: } 16: }
第一次运行的结果:
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
Main Thread
New Thread
第二次运行的结果:
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
New Thread
从以上结果可以看出来,每次运行的结果都不一样,你的机器上也可能不一样。
发表评论
-
Drools JBPM区别
2011-03-21 18:02 1793参考资料: 1、http://www.simpleframew ... -
推荐web开发教材
2009-11-25 13:00 1413大家能否给推荐一本 用JAVA语言相关的WEB开发方面的教材。 ... -
JAVA 线程编程 ----什么时候多线程可能不好(When Multiple Threads Might Not Be Good)
2009-11-13 12:59 1242设计程序时候创建更多的线程不总是一个好主意。线程不是免费的;它 ... -
JAVA 线程编程 ----为什么要用多线程(Why Use Multiple Thread)
2009-11-11 15:51 3365许多情况下,在一个程 ... -
JAVA 线程编程 ----线程介绍
2009-11-10 14:59 1252概述 浏览网页时,当 ... -
DataSource data source JNDI之间的关系
2009-09-16 17:01 2367data source :所谓data source就 ... -
字符,字节和编码三者的关系
2009-06-03 23:17 0http://www.regexlab.com/zh/enco ... -
jasperreport
2009-05-04 14:17 0http://www.docstoc.com/docs/213 ... -
iReport设计报表以Excel格式导出时注意的问题
2009-04-23 15:08 7210刚开始使用iReport工具,没想到就遇到了问题: 在以Exc ... -
到主机 的 TCP/IP 连接失败,达到最大连接数
2009-04-23 14:35 4429问题描述: _______________ ... -
Acegi框架介绍
2009-03-30 23:57 1499转自:这里 灰色字体 ... -
对语言的一些理解
2008-05-06 17:54 1458语言的本质 包 ... -
HOW TO DESIGN PROGRAMS
2008-04-21 09:55 1699http://www.htdp.org ·前言 向儿童传 ... -
AOP 入门好文章
2008-04-18 18:42 1445http://dev.rdxx.com/Java/2005-0 ... -
Head First JSP &Servlet读后感------chapt01
2008-01-02 22:50 2046Web程序和普通的GUI程序 ... -
JNDI资料整理
2007-12-26 16:38 1308******************************* ... -
JDBC初级应用实例(二) 转
2007-12-25 09:35 1232转自:http://blog.csdn.net/axman/a ... -
JDBC初级应用实例(一) 转
2007-12-25 09:25 1437转自:http://blog.csdn.net/a ... -
JDBC基础(四)转
2007-12-25 09:07 1279转自:http://blog.csdn.net/axman/a ... -
JDBC基础(三) 转
2007-12-24 18:49 1401转自:http://blog.csdn.net/a ...
相关推荐
- `Exchanger`则允许两个线程交换数据,每次只有一个线程可以完成交换,从而实现交替执行。 4. **线程间的通信**: - `wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间的通信。一个线程调用`...
死锁是多线程编程中常见的一个问题,它发生在两个或更多的线程永久阻塞,每个线程都在等待另一个线程释放资源的情况。解决死锁的方法包括但不限于: - 使用锁顺序:始终以相同的顺序获取锁。 - 使用超时:尝试获取锁...
在Java编程中,线程是程序执行的一个独立路径,允许多个任务在同一程序中并发执行。了解线程的相关概念对于开发高效、响应迅速的软件至关重要。 **1. 相关概念理解** 程序是一组静态的代码,而进程是这些代码在内存...
在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度...通过深入学习这份资料,开发者可以全面掌握Java多线程编程技术,提升程序的并发性能和稳定性。
Java线程是并发编程的核心部分,它允许程序同时执行多个任务,从而提高系统效率和响应速度。在这个"java线程1-10-720p版本"的学习资源中,我们将会深入理解Java线程的基本概念、创建方式、以及如何进行有效管理。 ...
通过学习《Java多线程编程实战指南》,开发者不仅可以理解多线程的基本概念,还能掌握如何在实际项目中运用多线程技术,提升程序的并发性能和稳定性。无论是初级开发者还是经验丰富的工程师,这本书都是一本值得阅读...
Java网络编程是构建分布式应用程序的关键技术,特别是在服务器端开发中,多线程和连接池是其核心概念。本文将深入探讨这两个主题,并结合文件传输的实际应用进行讲解。 首先,我们来理解多线程。在Java中,多线程...
死锁是多线程程序中常见的问题之一,当两个或更多线程相互等待对方持有的资源时会发生死锁。预防死锁的关键在于避免循环等待条件。 #### 十二、Java线程:新特征-线程池 线程池是一种管理线程的技术,可以有效地...
自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...
Java线程编程是Java开发中的重要组成部分,尤其在如今并发处理和高性能系统设计中不可或缺。本教程将深入探讨Java多线程的相关概念、原理及实战技巧。 首先,我们需要理解什么是线程。线程是程序执行的基本单元,一...
死锁是多线程编程中可能遇到的问题,当两个或多个线程相互等待对方释放资源而无法继续执行时,就会发生死锁。避免死锁的方法包括避免循环等待,合理设计资源获取顺序,使用死锁检测算法等。 线程间的通信也是重要的...
### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。本资料"Java多线程编程核心技术.zip"深入探讨了这些...
从给定的文件信息中,我们可以提取出关于Java多线程...以上是Java多线程编程的基础知识点,理解这些概念对于开发高效、健壮的多线程应用程序至关重要。通过实际操作和不断实践,可以更深入地掌握Java多线程编程的精髓。
了解并掌握这些Java线程编程的基础知识,有助于编写出高效的并发程序,充分利用多核处理器的计算能力,提高系统的响应速度和吞吐量。在实际编程中,还需要考虑线程安全、性能优化和异常处理等问题。
### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...
下面我们将深入探讨这两个方法以及多线程编程中的关键概念。 1. **创建线程** - **继承Thread类**:创建一个新的类,该类继承自`Thread`类,然后重写`run()`方法。实例化这个新类的对象并调用`start()`方法来启动...
Java线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,线程是程序执行的基本单元,理解并熟练掌握线程编程对于构建高效、并发的系统至关重要。 一、Java线程...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类或者实现`Runnable`接口。 1. **继承Thread类*...