搜档网
当前位置:搜档网 › JAVA多线程简单案例.

JAVA多线程简单案例.

JAVA多线程简单案例.
JAVA多线程简单案例.

第一页在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为Java 编程语言提供了语言级的支持。本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观。读完本文以后,用户应该能够编写简单的多线程程序。

为什么会排队等待?下面的这个简单的 Java 程序完成四项不相关的任务。这样的程序有单个控制线程,控制在这四个任务之间线性地移动。此外,因为所需的资源 ? 打印机、磁盘、数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含明显的等待时间。因此,程序在访问数据库之前必须等待打印机完成打印文件的任务,等等。如果您正在等待程序的完成,则这是对计算资源和您的时间的一种拙劣使用。改进此程序的一种方法是使它成为多线程的。四项不相关的任务class myclass { static public void main(String args[]

{ print_a_file(; manipulate_another_file(; access_database(;

draw_picture_on_screen(; } } 在本例中,每项任务在开始之前必须等待前一项任务完成,即使所涉及的任务毫不相关也是这样。但是,在现实生活中,我们经常使用多线程模型。我们在处理某些任务的同时也可以让孩子、配偶和父母完成别的任务。例如,我在写信的同时可能打发我的儿子去邮局买邮票。用软件术语来说,这称为多个控制(或执行)线程。可以用两种不同的方法来获得多个控制线程:多个进程在大多数操作系统中都可以创建多个进程。当一个程序启动时,它可以为即将开始的每项任务创建一个进程,并允许它们同时运行。当一个程序因等待网络访问或用户输入而被阻塞时,另一个程序还可以运行,这样就增加了资源利用率。但是,按照这种方式创建每个进程要付出一定的代价:设置一个进程要占用相当一部分处理器时间和内存资源。而且,大多数操作系统不允许进程访问其他进程的内存空间。因此,进程间的通信很不方便,并且也不会将它自己提供给容易的编程模型。线程线程也称为轻型进程 (LWP。因为线程只能在单个进程的作用域内活动,所以创建线程比创建进程要廉价得多。这样,因为线程允许协作和数据交换,并且在计算资源方面非常廉价,所以线程比进程更可取。线程需要操作系统的支持,因此不是所有的机器都提供线程。Java 编程语言,作为相当新的一种语言,已将线程支持与语言本身合为一体,这样就对线程提供了强健的支持。使用 Java 编程语言实现线程Jav

a编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的。尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有一些概念需要掌握。

要记住的一件重要的事情是 main( 函数也是一个线程,并可用来做有用的工作。程序员只有在需要多个线程时才需要创建新的线程。Thread 类Thread 类是一个具体的类,即不是抽象类,该类封装了线程的行为。要创建一个线程,程序员必须创建一个从 Thread 类导出的新类。程序员必须覆盖 Thread 的 run( 函数来完成有用的工作。用户并不直接调用此函数;而是必须调用 Thread 的 start( 函数,该函数再调用 run(。下面的代码说明了它的用法:创建两个新线程import java.util.*; class TimePrinter extends Thread { int pauseTime; String name; public TimePrinter(int x, String n { pauseTime = x; name = n; }

public void run( { while(true { try { System.out.println(name + ":" + new Date(System.currentTimeMillis(; Thread.sleep(pauseTime; } catch(Exception e { System.out.println(e; } } } static public void main(String args[] { TimePrinter tp1 = new TimePrinter(1000, "Fast Guy"; tp1.start(; TimePrinter tp2 = new TimePrinter(3000, "Slow Guy"; tp2.start(; } }

在本例中,我们可以看到一个简单的程序,它按两个不同的时间间隔(1 秒和 3 秒)在屏幕上显示当前时间。这是通过创建两个新线程来完成的,包括 main( 共三个线程。但是,因为有时要作为线程运行的类可能已经是某个类层次的一部分,所以就不能再按这种机制创建线程。虽然在同一个类中可以实现任意数量的接口,但Java 编程语言只允许一个类有一个父类。同时,某些程序员避免从 Thread 类导

出,因为它强加了类层次。对于这种情况,就要 runnable 接口。Runnable 接

口此接口只有一个函数,run(,此函数必须由实现了此接口的类实现。但是,就运行这个类而论,其语义与前一个示例稍有不同。我们可以用 runnable 接口改写前一个示例。(不同的部分用黑体表示。)创建两个新线程而不强加类层次import java.util.*; class TimePrinter implements Runnable { int pauseTime; String name; public TimePrinter(int x, String n { pauseTime = x; name = n; } public void run( { while(true { try

{ System.out.println(name + ":" + new Date(System.currentTimeMillis(; Thread.sleep(pau

seTime; } catch(Exception e { System.out.println(e; } } } static public void main(String args[] { Thread t1 = new Thread(new

TimePrinter(1000, "Fast Guy"; t1.start(; Thread t2 = new Thread(new TimePrinter(3000, "Slow Guy"; t2.start(; } } 请注意,当使用runnable 接口时,您不能直接创建所需类的对象并运行它;必须从 Thread 类的一个实例内部运行它。许多程序员更喜欢 runnable 接口,因为从 Thread 类继承会强加类层次。synchronized 关键字到目前为止,我们看到的示例都只是以非常简单的方式来利用线程。只有最小的数据流,而且不会出现两个线程访问同一个对象的情况。但是,在大多数有用的程序中,线程之间通常有信息流。试考虑一个金融应用程序,它有一个 Account 对象,如下例中所示:一个银行中的多项活动public class Account { String holderName; float amount;

public Account(String name, float amt { holderName = name; amount = amt; } public void deposit(float amt { amount += amt; } public void withdraw(float amt { amount -= amt; } public float checkBalance( { return amount; } } 第二页在此代码样例中潜伏着一个错误。如果此类用于单线程应用程序,不会有任何问题。但是,在多线程应用程序的情况中,不同的线程就有可能同时访问同一个 Account 对象,比如说一个联合帐户的所有者在不同的 ATM 上同时进行访问。在这种情况下,存入和支出就可能以这样的方式发生:一个事务被另一个事务覆盖。这种情况将是灾难性的。但是,Java 编程语言提供了一种简单的机制来防止发生这种覆盖。每个对象在运行时都有一个关联的锁。这个锁可通过为方法添加关键字 synchronized 来获得。这样,修订过的 Account 对象(如下所示)将不会遭受像数据损坏这样的错误:对一个银行中的多项活动进行同步处理public class Account { String holderName; float amount; public Account(String name, float amt

{ holderName = name; amount = amt; } public synchronized void deposit(float amt { amount += amt; } public synchronized void

withdraw(float amt { amount -= amt; } public float

checkBalance( { return amount; } } deposit( 和 withdraw( 函数都需要这个锁来进行操作,所以当一个函数运行时,另一个函数就被阻塞。请注意,checkBalance( 未作更改,它

严格是一个读函数。因为 checkBalance( 未作同步处理,所以任何其他方法都不会阻塞它,它也不会阻塞任何其他方法,不管那些方法是否进行了同步处理。Java 编程语言中的高级多线程支持线程组线程是被个别创建的,但可以将它们归类到线程组中,以便于调试和监视。只能在创建线程的同时将它与一个线程组相关联。在使用大量线程的程序中,使用线程组组织线程可能很有帮助。可以将它们看作是计算机上的目录和文件结构。线程间发信当线程在继续执行前需要等待一个条件时,仅有 synchronized 关键字是不够的。虽然 synchronized 关键字阻止并发更新一个对象,但它没有实现线程间发信。Object 类为此提供了三个函数:wait(、notify( 和 notifyAll(。以全球气候预测程序为例。这些程序通过将地球分为许多单元,在每个循环中,每个单元的计算都是隔离进行的,直到这些值趋于稳定,然后相邻单元之间就会交换一些数据。所以,从本质上讲,在每个循环中各个线程都必须等待所有线程完成各自的任务以后才能进入下一个循环。这个模型称为屏蔽同步,下例说明了这个模型:屏蔽同步public class BSync { int totalThreads; int currentThreads; public BSync(int x

{ totalThreads = x; currentThreads = 0; } public synchronized void waitForAll( { currentThreads++; if(currentThreads < totalThreads { try { wait(; } catch (Exception e {} } else { currentThreads = 0; notifyAll(; } } } 当对一个线程调用 wait( 时,该线程就被有效阻塞,只到另一个线程对同一个对象调用 notify( 或 notifyAll( 为止。因此,在前一个示例中,不同的线程在完成它们的工作以后将调用 waitForAll( 函数,最后一个线程将触发 notifyAll( 函数,该函数将释放所有的线程。第三个函数 notify( 只通知一个正在等待的线程,当对每次只能由一个线程使用的资源进行访问限制时,这个函数很有用。但是,不可能预知哪个线程会获得这个通知,因为这取决于 Java 虚拟机 (JVM 调度算法。将 CPU 让给另一个线程当线程放弃某个稀有的资源

(如数据库连接或网络端口)时,它可能调用 yield( 函数临时降低自己的优先级,以便某个其他线程能够运行。守护线程有两类线程:用户线程和守护线程。用户线程是那些完成有用工作的线程。守护线程是那些仅提供辅助功能的线程。Thread 类提供了 setDaemon( 函数。Java 程序将运行到所有用户

线程终止,然后它将破坏所有的守护线程。在 Java 虚拟机 (JVM 中,即使在main 结束以后,如果另一个用户线程仍在运行,则程序仍然可以继续运行。

避免不提倡使用的方法不提倡使用的方法是为支持向后兼容性而保留的那些方法,它们在以后的版本中可能出现,也可能不出现。Java 多线程支持在版本 1.1 和版本 1.2 中做了重大修订,stop(、suspend( 和 resume( 函数已不提倡使用。这些函数在 JVM 中可能引入微妙的错误。虽然函数名可能听起来很诱人,但请抵制诱惑不要使用它们。调试线程化的程序在线程化的程序中,可能发生的某些常见而讨厌的情况是死锁、活锁、内存损坏和资源耗尽。死锁死锁可能是多线程程序最常见的问题。当一个线程需要一个资源而另一个线程持有该资源的锁时,就会发生死锁。这种情况通常很难检测。但是,解决方案却相当好:在所有的线程中按相同的次序获取所有资源锁。例如,如果有四个资源 ?A、B、C 和

D ? 并且一个线程可能要获取四个资源中任何一个资源的锁,则请确保在获取对 B 的锁之前首先获取对 A 的锁,依此类推。如果“线程1”希望获取对 B 和 C 的锁,而“线程2”获取了 A、C 和 D 的锁,则这一技术可能导致阻塞,但它永远不会在这四个锁上造成死锁。活锁当一个线程忙于接受新任务以致它永远没有机会完成任何任务时,就会发生活锁。这个线程最终将超出缓冲区并导致程序崩溃。试想一个秘书需要录入一封信,但她一直在忙于接电话,所以这封信永远不会被录入。内存损坏如果明智地使用 synchronized 关键字,则完全可以避免内存错误这种气死人的问题。资源耗尽某些系统资源是有限的,如文件描述符。多线程程序可能耗尽资源,因为每个线程都可能希望有一个这样的资源。如果线程数相当大,或者某个资源的侯选线程数远远超过了可用的资源数,则最好使用资源池。一个最好的示例是数据库连接池。只要线程需要使用一个数据库连接,它就从池中取出一个,使用以后再将它返回池中。资源池也称为资源库。

调试大量的线程有时一个程序因为有大量的线程在运行而极难调试。在这种

情况下,下面的这个类可能会派上用场:public class Probe extends Thread

{ public Probe( {} public void run( { while(true { Thread[] x = new Thread[100]; Thread.enumerate(x; for(int i=0; i<100; i++ { Thread t = x[i]; if(t == null break; else System.out.println

(t.getName( + "\t" + t.getPriority( + "\t" + t.isAlive( + "\t" +

t.isDaemon(; } } } } 限制线程优先级和调度Java 线程模型涉及可以动态更改的线程优先级。本质上,线程的优先级是从 1 到 10 之间的一个数字,数字越大表明任务越紧急。JVM 标准首先调用优先级较高的线程,然后

才调用优先级较低的线程。但是,该标准对具有相同优先级的线程的处理是随机的。如何处理这些线程取决于基层的操作系统策略。在某些情况下,优先级相同的线程分时运行;在另一些情况下,线程将一直运行到结束。请记住,Java 支持 10 个优先级,基层操作系统支持的优先级可能要少得多,这样会造成一些混乱。因此,只能将优先级作为一种很粗略的工具使用。最后的控制可以通过明智地使用yield( 函数来完成。通常情况下,请不要依靠线程优先级来控制线程的状态。

小结本文说明了在 Java 程序中如何使用线程。像是否应该使用线程这样的更重要的问题在很大程序上取决于手头的应用程序。决定是否在应用程序中使用多线程的一种方法是,估计可以并行运行的代码量。并记住以下几点:使用多线

程不会增加 CPU 的能力。但是如果使用 JVM 的本地线程实现,则不同的线程可以在不同的处理器上同时运行(在多 CPU 的机器中),从而使多 CPU 机器得到充分利用。如果应用程序是计算密集型的,并受 CPU 功能的制约,则只有多 CPU 机器能够从更多的线程中受益。当应用程序必须等待缓慢的资源(如网络连

接或数据库连接)时,或者当应用程序是非交互式的时,多线程通常是有利的。

基于 Internet 的软件有必要是多线程的;否则,用户将感觉应用程序反映迟钝。例如,当开发要支持大量客户机的服务器时,多线程可以使编程较为容易。在这种情况下,每个线程可以为不同的客户或客户组服务,从而缩短了响应时间。某

些程序员可能在 C 和其他语言中使用过线程,在那些语言中对线程没有语言支

持。这些程序员可能通常都被搞得对线程失去了信心。

Java多线程技术及案例

Java多线程技术及案例 进程和线程: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。 线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。 多进程是指操作系统能同时运行多个任务(程序)。 多线程是指在同一程序中有多个顺序流在执行。 Java中多线程的多种实现方式 Java中有多种多线程实现方法,主要是继承https://www.sodocs.net/doc/5d3596089.html,ng.Thread类的方法和 https://www.sodocs.net/doc/5d3596089.html,ng.Runnable接口的方法。 继承Thread类 Thread是https://www.sodocs.net/doc/5d3596089.html,ng包中的一个类,从这个类中实例化的对象代表线程,启动一个新线程需要建立一个Thread实例。 使用Thread类启动新的线程的步骤如下: 1.实例化Thread对象 2.调用start()方法启动线程 构造方法:

public Thread(String threadName); public Thread(); 例程: publicclass Thread1extends Thread{//定义一个类继承Thread privateint count=1000; publicvoid run(){//重写run方法 while(true){ System.out.print(count+" "); if(--count==0){ return; } } } publicstaticvoid main(String[] args){ Thread1 th1=new Thread1();//实例化继承了Thread的类 Thread1 th2=new Thread1(); th1.start();//调用start()方法, th2.start(); for(int i=0;i<1000;i++){ System.out.print("A "); } }

Java第七单元练习题-Java多线程机制

7Java多线程机制 7.1单项选择题 1. 线程调用了sleep()方法后,该线程将进入()状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 终止状态 2. 关于java线程,下面说法错误的是() A. 线程是以CPU为主体的行为 B. java利用线程使整个系统成为异步 C. 创建线程的方法有两种:实现Runnable接口和继承Thread类 D. 新线程一旦被创建,它将自动开始运行 3. 在java中的线程模型包含() A. 一个虚拟处理器 B. CPU执行的代码 C. 代码操作的数据 D. 以上都是 4.在java语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。 A. synchronized B. include C. import D. Thread 5. 线程控制方法中,yield()的作用是() A. 返回当前线程的引用 B. 使比其低的优先级线程执行 C. 强行终止线程 D. 只让给同优先级线程运行 6. 线程同步中,对象的锁在()情况下持有线程返回 A. 当synchronized()语句块执行完后 B. 当在synchronized()语句块执行中出现例外(exception)时 C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时

C. 线程调用了yield()方法时 D. 以上都是 8. java用()机制实现了进程之间的异步执行 A. 监视器 B. 虚拟机 C. 多个CPU D. 异步调用 类的方法中,toString()方法的作用是() A. 只返回线程的名称 B. 返回当前线程所属的线程组的名称 C. 返回当前线程对象 D. 返回线程的名称 语言具有许多优点和特点,下列选项中,哪个反映了Java程序并行机制的特点() A. 安全性 B. 多线程 C. 跨平台 D. 可移值 11.以下哪个关键字可以用来对对象加互斥锁?() A. transient B. synchronized C. serialize D. static 12.下面关于进程、线程的说法不正确的是( )。 A.进程是程序的一次动态执行过程。一个进程在其执行过程中,可以产生多个线程——多线程,形成多条执行线索。 B.线程是比进程更小的执行单位,是在一个进程中独立的控制流,即程序内部的控制流。线程本身不能自动运行,栖身于某个进程之中,由进程启动执行。 C.Java多线程的运行与平台无关。 D.对于单处理器系统,多个线程分时间片获取CPU或其他系统资源来运行。对于多处理器系统,线程可以分配到多个处理器中,从而真正的并发执行多任务。 7.2填空题 1.________是java程序的并发机制,它能同步共享数据、处理不同的事件。 2.线程是程序中的一个执行流,一个执行流是由CPU运行程序的代码、__________所形 成的,因此,线程被认为是以CPU为主体的行为。 3.线程的终止一般可以通过两种方法实现:自然撤销或者是__________. 4.线程模型在java中是由__________类进行定义和描述的。 5.线程的创建有两种方法:实现_________接口和继承Thread类。 6.多线程程序设计的含义是可以将程序任务分成几个________的子任务。 7.按照线程的模型,一个具体的线程也是由虚拟的CPU、代码与数据组成,其中代码与数 据构成了___________,线程的行为由它决定。 8.ava中,新建的线程调用start()方法、如(),将使线程的状态从New(新建状态)转换为 _________。 9.多线程是java程序的________机制,它能同步共享数据,处理不同事件。 10.进程是由代码、数据、内核状态和一组寄存器组成,而线程是表示程序运行状态的

Java_2实用教程第4版_第12章_Java多线程机制

2014/1/20 第 1 页 注意:开始用功了! 1 2014/1/20 第 2 页 《Java2实用教程(第4版)》第12章 配合例子源代码一起使用 Power point 制作:耿祥义张跃平 Java多线程机制 2 2014/1/20 第 3 页 导读 主要内容 Java中的线程 Thread类与线程的创建 线程的常用方法 线程同步 协调同步的线程 线程联合 GUI线程 计时器线程 3 2014/1/20 第 4 页 §12.1 进程与线程 §12.1.1 操作系统与进程 程序是一段静态的代码,它是应用软件执行的蓝本。 进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。 现代操作系统可以同时管理一个计算机系统中的多个进程,即可以让计算机系统中的多个进程轮流使用CPU资源。 4 2014/1/20 第 5 页 §12.1.2 进程与线程 线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程。 线程间可以共享进程中的某些内存单元(包括代码与数据),线程的中断与恢复可以更加节省系统的开销。 5 2014/1/20 第 6 页

§12.2 Java中的线程 §12.2.1 Java的多线程机制 Java语言的一大特性点就是内置对多线程的支持。 Java虚拟机快速地把控制从一个线程切换到另一个线程。这些线程将被轮流执行,使得每个线程都有机会使用CPU资源。 6 2014/1/20 第7 页 §12.2.2 主线程(main线程) 每个Java应用程序都有一个缺省的主线程。 当JVM(Java Virtual Machine 虚拟机)加载代码,发现main方法之后,就会启动一个线程,这个线程称为“主线程”(main线程),该线程负责执行main方法。 JVM一直要等到Java应用程序中的所有线程都结束之后,才结束Java应用程序。 7 2014/1/20 第8 页 §12.2.3 线程的状态与生命周期 建的线程在它的一个完整的生命周期中通常要经历如下的四种状态: 1.新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。2.运行:线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。一旦轮到它来享用CPU资源时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了。 3.中断:有4种原因的中断: ◆JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。 ◆线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状。 ◆线程使用CPU资源期间,执行了wait()方法。 ◆线程使用CPU资源期间,执行某个操作进入阻塞状态。 4.死亡:处于死亡状态的线程不具有继续运行的能力。线程释放了实体。 8 2014/1/20 第9 页 例子1(Example12_1.java )通过分析运行结果阐述线程的4种状态。例子1在主线程中用Thread的子类创建了两个线程(SpeakElephant.java , SpeakCar.java ),这两个线程分别在命令行窗口输出20句“大象”和“轿车”;主线程在命令行窗口输出15句“主人”。 例子1的运行效果如图12.4。 例子1在不同的计算机运行或在同一台计算机反复运行的结果不尽相同,输出结果依赖当前CPU资源的使用情况。 9 2014/1/20 第10 页 §12.2.4 线程调度与优先级 处于就绪状态的线程首先进入就绪队列排队等候CPU资源,同一时刻在就绪队列中的线程可能有多个。Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先

JAVA多线程试题 答案

多线程 一.选择题 1.下列说法中错误的一项是(A) A.线程就是程序 B.线程是一个程序的单个执行流 B.多线程是指一个程序的多个执行流D.多线程用于实现并发 2.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态(D) A.等待阴塞状态下的线程被notify()唤 B.等待阻塞状态下的纯种被interrput()中断 C.等待时间到 D.等待阻塞状态下的线程调用wait()方法 3.下列哪个方法可以使线程从运行状态进入其他阻塞状态(A) A.sleep B.wait C.yield D.start 4.下列说法中错误的一项是(D) A.一个线程是一个Thread类的实例 B.线程从传递给纯种的Runnable实例run()方法开始执行 C.线程操作的数据来自Runnable实例 D.新建的线程调用start()方法就能立即进入运行状态 5.下列关于Thread类提供的线程控制方法的说法中,错误的一项是(D) A.在线程A中执行线程B的join()方法,则线程A等待直到B执行完成 B.线程A通过调用interrupt()方法来中断其阻塞状态 C.若线程A调用方法isAlive()返回值为true,则说明A正在执行中 D.currentThread()方法返回当前线程的引用 6.下列说法中,错误的一项是() A.对象锁在synchronized()语句执行完之后由持有它的线程返还 B.对象锁在synchronized()语句中出现异常时由持有它的线程返还 C.当持有锁的线程调用了该对象的wait()方法时,线程将释放其持有的锁 D.当持有锁的线程调用了该对象的构造方法时,线程将释放其持有的锁 7.下面的哪一个关键字通常用来对对象的加锁,从而使得对对象的访问是排他的A A.sirialize B transient C synchronized D static 二.填空题 1.在操作系统中,被称做轻型的进程是线程 2.多线程程序设计的含义是可以将一个程序任务分成几个并行的任务 3.在Java程序中,run()方法的实现有两种方式:实现Runnable接口和继承Thread类 4.多个线程并发执行时,各个线程中语句的执行顺序是确定的,但是线程之间的相对执行顺序是不确定的 6.Java中的对象锁是一种独占的排他锁 7.程序中可能出现一种情况:多个线种互相等待对方持有的锁,而在得到对方的锁之前都不会释放自己的锁,这就是死锁 8.线程的优先级是在Thread类的常数MIN_PRIORITY和MAX_PRIORITY 之间的一个值 9.处于新建状态的线程可以使用的控制方法是start()和stop()。 10.一个进程可以包含多个线程

15个Java多线程面试题及答案

15个Java多线程面试题及答案 1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。 2)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编程中最大的优势是它们为读和写分别提 供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。Java线程面试的问题越来越会根据面试者的回答来提问。芯学苑老师强烈建议在你在面试之前认真读一下Locks,因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间。 3)在java中wait和sleep方法的不同?

通常会在电话面试中经常被问到的Java线程面试问题。最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。 4)用Java实现阻塞队列。 这是一个相对艰难的多线程面试问题,它能达到很多的目的。第一,它可以检测侯选者是否能实际的用Java线程写程序;第二,可以检测侯选者对并发场景的理解,并且你可以根据这个问很多问题。如果他用wait()和notify()方法来实现阻塞队列,你可以要求他用最新的Java 5中的并发类来再写一次。 5)用Java写代码来解决生产者——消费者问题。 与上面的问题很类似,但这个问题更经典,有些时候面试都会问下面的问题。在Java中怎么解决生产者——消费者问题,当然有很多解决方法,我已经分享了一种用阻塞队列实现的方法。有些时候他们甚至会问怎么实现哲学家进餐问题。 6)用Java编程一个会导致死锁的程序,你将怎么解决?

Java第七单元练习题Java多线程机制

J a v a第七单元练习题 J a v a多线程机制 The latest revision on November 22, 2020

7Java多线程机制 7.1单项选择题 1. 线程调用了sleep()方法后,该线程将进入()状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 终止状态 2. 关于java线程,下面说法错误的是() A. 线程是以CPU为主体的行为 B. java利用线程使整个系统成为异步 C. 创建线程的方法有两种:实现Runnable接口和继承Thread类 D. 新线程一旦被创建,它将自动开始运行 3. 在java中的线程模型包含() A. 一个虚拟处理器 B. CPU执行的代码 C. 代码操作的数据 D. 以上都是 4.在java语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。 A. synchronized B. include C. import D. Thread 5. 线程控制方法中,yield()的作用是() A. 返回当前线程的引用 B. 使比其低的优先级线程执行 C. 强行终止线程 D. 只让给同优先级线程运行 6. 线程同步中,对象的锁在()情况下持有线程返回 A. 当synchronized()语句块执行完后 B. 当在synchronized()语句块执行中出现例外(exception)时 C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时 C. 线程调用了yield()方法时 D. 以上都是 8. java用()机制实现了进程之间的异步执行

java多线程并发面试题【java多线程和并发基础面试题】

java多线程并发面试题【java多线程和并 发基础面试题】 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。下面就由小编为大家介绍一下java多线程和并发基础面试题的文章,欢迎阅读。 java多线程和并发基础面试题篇1 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的来创建和驻留在进程中,并且可以共享进程中的。 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待而进入空闲状态。多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而CGI不支持。 3. 用户线程和守护线程有什么区别? 当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的

线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。 4. 我们如何创建一个线程? 有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类。 java多线程和并发基础面试题篇2 1. 有哪些不同的线程生命周期? 当我们在Java程序中新建一个线程时,它的状态是New。当我们调用线程的start()方法时,状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并且讲它们的状态改变为Running。其他的线程状态还有Waiting,Blocked 和Dead。 2. 可以直接调用Thread类的run()方法么? 当然可以,但是如果我们调用了Thread的run()方法,它的行为就会和普通的方法一样,为了在新的线程中执行我们的代码,必须使用Thread.start()方法。 3. 如何让正在运行的线程暂停一段时间? 我们可以使用Thread类的Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行。

Java并发编程实践

1对象的共享 关键字synchronized不仅能实现原子性还能确保当一个线程修改了对象状态后,另一个线程就可以看到对象状态的变化(内存可见性) 1.1可见性 重排序:在缺乏足够同步的多线程程序中,代码的执行顺序不会按照程序员写好的顺序进行。这是因为Java内存模型允许编译器、CPU对操作的执行顺序进行调整。 1.1.1失效数据 在多线程程序中,get方法、set方法都需要进行同步。这是因为get方法在获取变量时可能会获得一个失效的值,这个失效的值就是之前某个线程设置的。虽然已经失效但这个值曾经是正确的。 1.1.2非原子的64位操作 Java内存模型要求,非volatile类型的64位数值变量(double和long),JVM允许将64位的读操作和写操作分解为两个32位的操作。 那么在多线程的环境中,如果要读取非volatile类型的double、隆就有可能会读取到某个值的高32位和另一个值的低32位组成的一个数值。 但目前各种平台的商用虚拟机几乎都把64位数据的读写操作作为原子操作来对待。1.1.3加锁与可见性 加锁的含义不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上同步。 同步代码块的锁就是方法调用所在的对象,静态synchronized方法以Class对象作为锁。 synchronized可以用于实例变量、对象引用、static方法、类名称字面常量。 1.在某个对象实例内,synchronized aMethod(){} 可以防止多个线程同时访问这个对象其他

的synchronized方法(这个对象还有其他的synchronized方法,如果其中一个线程访问了其中一个synchronized方法,那么其他线程将不能访问此对象另外的synchronized方法)。但不同的对象实例间的synchronized方法是相互独立的,也就是说其他线程照样可以访问相同类的另一个对象实例的synchronized方法。 2.synchronized static aMethod(){}对这个类所有的静态synchronized方法都会起作用,但 不会对非静态的synchronized起作用。这是因为static方法属于类方法,他属于这个Class (注意:这里的Class不是指Class的某个具体对象),那么static方法所获取到的锁就是调用这个方法的对象所属的类,而非static方法获取到的锁就是当前调用这个方法的对象了。 3.除了在方法上用synchronized关键字外,也可以在方法内部的某个区块中用synchronized 表示只对这个区块中的资源进行同步访问,例如synchronized(this){/**区块**/}的作用域就是当前对象。 1.1.3.1非static方法 运行结果是:chunk对象与chunk1对象锁互不干扰。 chunk1 9chunk

Java多线程详解

JAVA多线程编程详解 一、理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享 一个存储空间,这使得线程间的通信远较进程简单。 具体到java内存模型,由于Java 被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。系统存在一个主内存(Main Memory),Java 中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。 “”“” 多个线程的执行是并发的,也就是在逻辑上同时,而不管是否是物理上的同时。如 ,那么真正的同时是不可能的。多线程和传统的单线程在程序设计果系统只有一个CPU“” 上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执 行的,将会带来线程调度,同步等问题。 二、在Java中实现多线程 我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明 这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切! 作为一个完全面向对象的语言,Java提供了类https://www.sodocs.net/doc/5d3596089.html,ng.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程。 那么如何提供给Java 我们要线程执行的代码呢?让我们来看一看Thread 类。Thread 类最重要的方法是run(),它为Thread 类的方法start()所调用,提供我们的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它! 方法一:继承Thread 类,重写方法run(),我们在创建的Thread 类的子类中重写run(),加入线程所要执行的代码即可。下面是一个例子:

Java第七单元练习题Java多线程机制(20210109223217)

7 Java 多线程机制 7.1 单项选择题 1. 线程调用了sleep ()方法后,该线程将进入( )状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 终止状态 2. 关于java 线程,下面说法错误的是() A. 线程是以CPU为主体的行为 B. java 利用线程使整个系统成为异步 C. 创建线程的方法有两种:实现Runnable 接口和继承Thread 类 D. 新线程一旦被创建,它将自动开始运行 3. 在java 中的线程模型包含() A. 一个虚拟处理器 B. CPU执行的代码 C. 代码操作的数据 D. 以上都是 4. 在java 语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。 A. synchronized B. include C. import D. Thread 5. 线程控制方法中,yield()的作用是() A. 返回当前线程的引用 B. 使比其低的优先级线程执行 C. 强行终止线程 D. 只让给同优先级线程运行 6. 线程同步中,对象的锁在()情况下持有线程返回 A. 当synchronized()语句块执行完后 B. 当在synchronized()语句块执行中出现例外( exception )时 C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时 C. 线程调用了yield()方法时 D. 以上都是 8. java 用()机制实现了进程之间的异步执行 A. 监视器 B. 虚拟机

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

一、理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。 具体到java内存模型,由于Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。 多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独

立,使得各个线程之间的代码是乱序执行的,将会带来线程调度,同步等问题。 二、在Java中实现多线程 我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切! 作为一个完全面向对象的语言,Java提供了类https://www.sodocs.net/doc/5d3596089.html,ng.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程。 那么如何提供给Java 我们要线程执行的代码呢?让我们来看一看Thread 类。Thread 类最重要的方法是run (),它为Thread 类的方法start()所调用,提供我们的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它! 方法一:继承Thread 类,重写方法run(),我们在创建Thread 类的子类中重写run(),加入线程所要执行的代码即可。下面是一个例子:

Java学习笔记(Java名词解释和多线程编程)

名词解释 & JAVA多线程编程 名词解释: JNI(Java Native Interface)指的是Java本地调用接口,通过这一接口,Java程序可以和采用其他语言编写的本地程序进行通信。 IPC是两个进程之间进行通信的一种机制。 JMX(Java Management Extensions)是SUN提出的Java管理扩展规范,是一个为应用程序、设备和系统植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议。通过JMX,用户可以灵活地开发无缝集成的系统、网络和服务管理应用。 JNDI(Java Naming and Directory Interface)是一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和惟一的名字绑定。外部程序可以通过名字来获得某个对象的引用。 DTD即文档类型定义。 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是Internet 传送E-mail的基本协议,也是TCP/IP协议组的成员。SMTP解决了E-mail系统

如何通过一条链路,把邮件从一台机器传递到另一台机器上的问题。通常把发送邮件服务器称为SMTP服务器。 POP3(Post Office Protocol3)即邮局协议第3版,这是Internet接收E-mail 的基本协议,也是TCP/IP协议组的成员。 IMAP(Internet Message Access Protocol)即直接收取邮件的协议,是与POP3不同的一种E-mail接收的新协议。 MIME(Multipurpose Internet Mail Extensions)是一种电子邮件编码方式,它可以将发信人的电子邮件中的文本以及各种附件都打包后发送。 SOAP(Simple Object Access Protocol)即简单对象访问协议,是在分散或分布式的环境中交换信息的简单协议,它以XML作为数据传送方式。 OOP即面向对象程序设计 OOA(Object Oriented Analysis)即面向对象的分析。 OOD(Object Oriented Design)即面向对象的设计。 OOI(Object Oriented Implementation)即面向对象的实现。

java实现多线程的网络并发服务器

课程设计说明书 课程名称: 操作系统原理-课程设计 课程代码: 题目: 多线程的网络并发服务器设计 年级/专业/班: 学生姓名: 学号: 开始时间:2011 年12月11日 完成时间:2011 年12月24 日 课程设计成绩: 指导教师签名:年月日

目录 1 引言 (1) 1.1问题的提出 (1) 1.2国内外研究的现状 (1) 1.3任务与分析 (1) 2 程序的主要功能 (2) 2.1客户端接收和发送消息功能 (2) 2.2服务器分配和回收序号功能 (2) 2.3服务器显示信息功能 (2) 3 程序运行平台 (3) 4 总体设计 (4) 5 程序类的说明 (5) 6 模块分析 (10) 6.1客服端模块 (10) 6.2服务器模块 (10) 6.3处理客户端线程的模块 (12) 6.4服务器线程模块 (12) 7 系统测试 (13) 8 结论 (18) 参考文献 (19) I

1 引言 1.1 问题的提出 在现代化的生活中,网络无处不在,那么是怎样来实现客户与服务器的通信的呢,服务器是怎样来实现处理不同客户端发来的请求,这就涉及到多线程的网络并发服务器的设计。 1.2国内外研究的现状 传统的并发服务器往往是基于多进程机制的,每个客户一个进程,需要操作系统的干预,进程数目受操作系统的限制。然而许多新型操作系统都是多线程,将并行服务器设计为多线程,可以增加其效率。这样,不必为每个服务请求启动一个单独的进程或任务,多线程并行服务器可以启动一个执行速度更快的独立线程。如果主机是多处理器的,则多线程并行服务器能够在多处理机上执行多个线程。 1.3任务与分析 一个进程可以创建多个线程,线程与线程间的通信方式比较容易。本设计主要是编写一个多线程的网络通信程序,不同的线程处理不同类型的消息,比如有专门处理TCP 的线程、专门处理UDP消息的线程等。 1

【2020最新Java面试题资料】15道面试常问的Java多线程面试题

1)现在有T1T2T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。 2)在中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。线程面试的问题越来越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下Locks,因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间。 3)在java中wait和sleep方法的不同? 通常会在电话面试中经常被问到的线程面试问题。最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。 4)用实现阻塞队列。 这是一个相对艰难的多线程面试问题,它能达到很多的目的。第一,它可以检测侯选者是否能实际的用线程写程序;第二,可以检测侯选者对并发场景的理解,并且你可以根据这个问很多问题。如果他用wait()和notify()方法来实现阻塞队列,你可以要求他用最新的Java 5中的并发类来再写一次。 5)用Java写代码来解决生产者——消费者问题。 与上面的问题很类似,但这个问题更经典,有些时候面试都会问下面的问题。在中怎么解决生产者——消费者问题,当然有很多解决方法,我已经分享了一种用阻塞队列实现的方法。有些时候他们甚至会问怎么实现哲学家进餐问题。 6)用编程一个会导致死锁的程序,你将怎么解决? 这是我最喜欢的线程面试问题,因为即使死锁问题在写多线程并发程序时非常普遍,但是很多侯选者并不能写deadlock free code(无死锁代码?),他们很挣扎。只要告诉他们,你有N个资源和N个线程,并且你需要所有的资源来完成一个操作。为了简单这里的n可以替换为2,越大的数据会使问题看起来更复杂。通过避免中的死锁来得到关于死锁的更多信息。

15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的。他们会问面试者很多令人混淆的Java线程问题。面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面。用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的。下面这些是我在不同时间不同地点喜欢问的Java线程问题。我没有提供答案,但只要可能我会给你线索,有些时候这些线索足够回答问题。现在引用Java5并发包关于并发工具和并发集合的问题正在增多。那些问题中ThreadLocal、Blocking Queue、Counting Semaphore和ConcurrentHashMap比较流行。 15个Java多线程面试题及回答 1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。 2)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。Java线程面试的问题越来越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下Locks,因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间。 3)在java中wait和sleep方法的不同? 通常会在电话面试中经常被问到的Java线程面试问题。最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。 4)用Java实现阻塞队列。 这是一个相对艰难的多线程面试问题,它能达到很多的目的。第一,它可以检测侯选者是否能实际的用Java线程写程序;第二,可以检测侯选者对并发场景的理解,并且你可以根据这个问很多问题。如果他用wait()和notify()方法来实现阻塞队列,你可以要求他用最新的Java 5中的并发类来再写一次。 5)用Java写代码来解决生产者——消费者问题。 与上面的问题很类似,但这个问题更经典,有些时候面试都会问下面的问题。在Java中怎么解决生产者——消费者问题,当然有很多解决方法,我已经分享了一种用阻塞队列实现的方法。有些时候他们甚至会问怎么实现哲学家进餐问题。

JAVA中实现多线程总结

我们知道,在操作系统级别上软件的运行一般都是以进程为单位,而在每个进程的运行过程中允许同时并发执行多个不同线程,这就使得一个程序能同时执行不同的操作。使用多线程的目的是为了最大限度地利用计算机CPU资源。JAVA程序字节码最终是在JVM虚拟机下运行的,同一虚拟机进程中的不同操作都是通过多线程来运行的。在JAVA虚拟机中,线程常用有单线程和多线程,单线程指程序执行过程只是一个有效操作的序列,不同操作都有着明确的先后顺序;而多线程允许同时进行着不同的操作,这些不同的操作同时并发进行着,并由CPU时钟频率根据不同的调度方式对他们进行执行调度。 在JAVA语言中提供了丰富的多线程操纵接口,提供了各类不同的线程实现方法供我们选择,功能非常强大。在手机软件设计中,由于同样需要执行网络连接(基于HTTP的高级Internet协议通讯)、UI调度等待、UI显示幻化、游戏控制等操作需要通过后台的数据运算或UI不断更新等操作。因此在J2ME中,KVM虚拟机也提供了功能强大的多线程API,使我们同样能在J2ME中实现线程的并发运算。 在J2ME中,主要有以下三种方法实现多线程。 一、继承Thread类(https://www.sodocs.net/doc/5d3596089.html,ng.Thread) 通过编写线程类继承Thread类并重写Thread类中的run()方法实现线程,当线程对象被运行时候将会自动执行run方法中的实体内容,从而开辟一个单独的线程并运行起来。 如:public class ThreadSimple extends Thread{ public ThreadSimple() { //constructor } public void run() { //run code entity } } 线程实例使用,直接创建对象并调用start()方法即可运行线程。 new ThreadSimple().start(); 当执行start方法时候,将会自动运行run方法,但是执行start方法时候只做了一件事,就是将线程转化为可执行状态,然后等待操作系统进行调度并运行,因此无法保证线程能立即启动。在JAVA中,Thread类实现了Runnable接口,因此run方法是通过实现接口Runnable中的抽象方法。

java并发编程--一道经典多线程题的2种解法

问题的描述 启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印 16,17,18,19,20....以此类推, 直到打印到75. 程序的输出结果应该为: 线程1: 1 线程1: 2 线程1: 3 线程1: 4 线程1: 5 线程2: 6 线程2: 7 线程2: 8 线程2: 9 线程2: 10 ... 线程3: 71 线程3: 72 线程3: 73 线程3: 74 线程3: 75

解法一: 采用原始的synchronized, wait(), notify(), notifyAll()等方式控制线程. Java代码 1.public class NumberPrintDemo { 2. // n为即将打印的数字 3. private static int n = 1; 4. // state=1表示将由线程1打印数字, state=2表示将由线程2打印 数字, state=3表示将由线程3打印数字 5. private static int state = 1; 6. 7. public static void main(String[] args) { 8. final NumberPrintDemo pn = new NumberPrintDemo(); 9. new Thread(new Runnable() { 10. public void run() { 11. // 3个线程打印75个数字, 单个线程每次打印5个连 续数字, 因此每个线程只需执行5次打印任务. 3*5*5=75 12. for (int i = 0; i < 5; i++) { 13. // 3个线程都使用pn对象做锁, 以保证每个交替 期间只有一个线程在打印 14. synchronized (pn) { 15. // 如果state!=1, 说明此时尚未轮到线程1 打印, 线程1将调用pn的wait()方法, 直到下次被唤醒 16. while (state != 1) 17. try { 18. pn.wait(); 19. } catch (InterruptedException e) { 20. e.printStackTrace(); 21. } 22. // 当state=1时, 轮到线程1打印5次数 字 23. for (int j = 0; j < 5; j++) { 24. // 打印一次后n自增 25. System.out.println(Thread.currentTh read().getName() 26. + ": " + n++); 27. } 28. System.out.println();

JAVA多线程编程(详细操作例子)(低分分享)

多线程 一、理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。 具体到java内存模型,由于Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。 多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,将会带来线程调度,同步等问题。 二、在Java中实现多线程 我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切! 作为一个完全面向对象的语言,Java提供了类https://www.sodocs.net/doc/5d3596089.html,ng.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程。 那么如何提供给Java 我们要线程执行的代码呢?让我们来看一看Thread 类。Thread 类最重要的方法是run(),它为Thread 类的方法start()所调用,提供我们的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它! 方法一:继承Thread 类,重写方法run(),我们在创建Thread 类的子类中重写run (),加入线程所要执行的代码即可。下面是一个例子: public class TwoThread extends Thread { public void run() { for ( int i = 0; i < 10; i++ ) { System.out.println("New thread"); } } public static void main(String[] args) { TwoThread tt = new TwoThread();

相关主题