`
xiebh
  • 浏览: 604349 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

JAVA 线程编程 ----两个线程程序

阅读更多
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类
  • 在继承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
从以上结果可以看出来,每次运行的结果都不一样,你的机器上也可能不一样。























分享到:
评论

相关推荐

    java多线程编程 在主线程main中创建两个子线程

    自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...

    JAVA多线程编程详解-详细操作例子

    本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...

    Java程序设计案例教程-第8章-多线程编程.pptx

    第4页 主要内容 8.1 Java线程模型 8.2 创建线程 8.3 同步与线程间通信 8.4 获取线程状态 8.5 本章小结 8.6 思考和练习 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第4页。 8.1 Java线程模型 Java对多...

    java 多线程编程实例

    内容是两个多线程编程的demo: 1.一个线程添加,一个线程减少 2.a线程呼叫b线程,b线程呼叫c线程,c线程呼叫a线程。 能学到: 在学习多线程编程中,我们要把大家用的对象独立出来,然后作为一个 变量传递到各个线程...

    Java并发编程面试题--共87题

    不管你是新程序员还是...注:本文档根据http://www.importnew.com/12773.html 和http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 这两个网站的并发编程试题集整理得到的文档,

    WHUT-java多线程实验-第五周-数据库.zip

    WHUT-java多线程实验-第五周-数据库(IDEA实现) ...即对 DataProcessing 类进行改进,不再使用 Hashtable 存储用户与档案信息,转而使用 JDBC 编程方式实现对数据库中的 user_info 与 doc_info 两个信息表的增删查改。

    Java并发编程--BlockingQueue.docx

    BlockingQueue支持两个附加操作的Queue:1)当Queue为空时,获取元素线程被阻塞直到Queue变为非空;2)当Queue满时,添加元素线程被阻塞直到Queue不满。BlockingQueue不允许元素为null,如果入队一个null元素,会抛...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    深入研究java的几个类--Java多线程编程总结

    在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。 调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;...

    Java高级程序设计-多线程(二).pptx

    3.1.1 模拟银行取款 创建模拟两个线程的取款类 DrawThread,该类继承 Thread 类。取钱的业务逻辑为当余额不足时无法提取现金,当余额足够时系统吐出钞票,减少余额 public class DrawThread extends Thread { // ...

    java用线程两种方式

    * 分别使用Runnable接口和Thread类编程实 编写一应用程序创建两个线程一个线程打印输出1—1000之间所有的奇数(Odd Number) * 另外一个线程打印输出1-1000之间所有的偶数(Even Number)要求两个线程随机休眠一 段...

    Java多线程编程的优点和缺点

    死锁(Deadlocks):多线程编程容易出现死锁,即多个线程相互等待对方释放资源的情况,导致程序无法继续执行。 线程同步开销:线程同步机制引入了额外的开销,如锁竞争、上下文切换等,可能降低程序性能

    编写程序,使用两个线程,一个队列,其中一个线程从键盘读取数据,放入到队列中,直到读取的数据是字符串quit则结束

    1. 编写程序,使用两个线程,一个队列, 其中一个线程从键盘读取数据,放入到队列中,直到读取的数据是字符串quit则结束,线程的任务就是循环读取数据直到特定的字符串quit。另外一个线程,不断的从队列中读取数据...

    Java多线程编程总结

    Java语言的多线程需要操作系统的支持。...Java语言提供了多线程编程的扩展点,并给出了功能强大的线程控制API。 在Java中,多线程的实现有两种方式: 扩展java.lang.Thread类 实现java.lang.Runnable接口

    多线程编程(java)

    多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。

    多线程编程实现矩阵乘法

    多线程编程实现矩阵乘法

    java 多线程编程 月食效果

    用两个圆叠加实现简单的实现月食的模拟,采用多线程实现动画效果。

    简易聊天程序_java网络编程多线程

    java编译的控制台版多人简易聊天程序,运用了ServerSocket和Socket网络编程,还用了多线程,I/O流等技术.可以私聊,可以群聊!

    Java多线程编程详解

    Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 ...

Global site tag (gtag.js) - Google Analytics