当前位置:文档之家› Java线程实例讲解【原创】

Java线程实例讲解【原创】

Java线程实例讲解【原创】
Java线程实例讲解【原创】

深入Java 线程

王伟2009-07-30 一、什么是线程

为了清楚什么是线程,先了解一下程序和进程的概念。

程序就是源代码和文档的集合,如果经过编译后,就是目标平台可执行的指令集合。程序是静态的。

相比之下,进程是动态的。操作系统加载可执行程序后,即产生了一系统进程,由操作系统调度管理。现代操作系统都是多任务多用户的,意味着操作系统可以调度许多进程。进程之间亦可以依赖于操作系统进行通信。进程是重量级的,因为进程的调度需要耗费大量的CPU和内存资源。

线程是进程的进一步划分,可以认为一个进程由多个线程按各自的执行路线运行而组成。由于线程共享同一个进程内存空间,线程间通信、调度开销要比进程之间的通信、调度开销要小得多。因此,现在的应用程序往往会采用多线程编程来提高性能。

二、创建Java线程

Java提供了语言级对线程的支持。Java中线程被抽象为对象,线程的创建需要用到Thread类或者Runnable接口。也就是说线程类的编写有两种方式:一种是扩展Thread类;另一种是实现Runnable接口。无论是哪一种方式,线程的执行体都是run方法。

代码Thread_1,采用扩展Thread类的方式定义线程类

测试类:

代码Thread_2,采用实现Runnable接口的方式定义线程类

测试类:

三、Java线程的状态及常用方法

Java线程状态可以用下表描述:

以下是线程状态过渡示意图:

Thread.start( ) 方法通知线程规化器这个线程已准备就绪,并尽快执行线程,即执行线程类的run方法。这意味着编程只能控制线程进入准备运行状态,何时真正运行则由线程规化器决定。

Thread.sleep( ) 方法将当前线程置入睡眠状态,进入睡眠状态的线程可能被其他线程中断而采取某种行为。睡眠线程被中断时,sleep方法抛出一InterruptException异常。

代码Thread_3

测试类:

输出结果:

在主线程(main方法)中,使用t3.interrupt( )中断了正在休眠的线程t3。实际上,Thread.interrupt( ) 方法只是在目标线程中设置了一个标志,表示它已经被中断,并立即返回。上例中,Thread.sleep( ) 方法检测到t3被中断,因此中断t3的休眠状态并抛出InterruptionException。如果在调用sleep()之前线程已经被interrupt ( )方法标志为中断,sleep( ) 会立即抛出。InterruptionException异常。

代码Thread_4:

main( ) 方法为主线程,Thread.currentThread( ) 方法能够获得当前线程的引用,即主线程。在主线程休眠之前,主线程被标识为中断,因此sleep( ) 方法立即抛出InterruptionException异常。

再来看一个例子:

测试类代码:

创建了2个线程t1、t2,t1的优先级为最低,而t2则是最高优先级,如果在线程类Thread_5中没有代码:

线程t1,几乎没有机会获得处理器来执行代码,出于等待状态,加上次代码后,如果是t2获得了处理器,执行完输出后,会通过Thread.yeild( ) 方法主动放弃使用处理器的权利,从而使得t1有机会执行。

对于Thread.stop( ) 、Thread.suspend( ) 、Thread.resume( ) 从Java 1.2之后不再赞成使用,这里不予以介绍。

四、线程并发

先看到一个例子:

代码Thread_6:

代码SharedObject:

测试代码:

测试代码输出:

从输出我们首先可以发现,doWork方法被X线程调用的同时也被Y线程调用。其次我们发现输出结果不正确,每个线程对value累加3次,value 最终结果应该是7,而不是6。

Thread.join( ) 方法的作用为等待线程结束,测试代码中,主线程输出value的结果,需要在线程X、Y都结束的情况下输出。

从上例我们可以得出结论,如果存在多线程线程并发的情况,数据很容易出现不一致的情况。Java多线程编程提供了两种机制来解决数据不一致的问题,分别需要使用到关键字volatile和synchronized。

待续

附录、有关线程的JVM知识

?什么是JVM

对Java虚拟机的理解,可以从以下三个方面着手:

Sun制定的抽象规范

一个具体的实现,可以是软件实现,也可以是硬件实现,甚至是软硬件混合实现

一个运行中的虚拟机实例

大多数时候,JVM的实现是基于操作系统之上的软件实现,比如Sun实现的JRE、BEA的JRockit等。当运行一个Java程序时,也就运行了一个JVM 实例;当这个程序结束时,该虚拟机实例也随之消亡。对于操作系统来说,JVM即是一个进程,而Java程序仅仅是其中的一个线程,这个线程的入口即是Java程序中的main方法。GC(垃圾收集器)也是JVM进程中的一个线程。GC是JVM控制的,Java程序对其的控制非常有限。如果在Java程序中创建了新的线程,那么这个线程的入口为https://www.doczj.com/doc/7f4979395.html,ng.Thread或者https://www.doczj.com/doc/7f4979395.html,ng.Runnable中的run方法。

?JVM的体系结构

在JVM规范中,使用子系统、内存区、数据类型及指令几个部分对JVM 进行描述。JVM规范通过定义这些组成部分以及它们之间的交互来定义任何JVM实现都必须遵守的行为。下图为JVM内部体系结构:

当JVM运行一个Java程序时,它需要内存来存储许多内容,例如,字节码、对象、参数、返回值、局部变量以及运行计算的中间结果等。JVM把

这些内容组织到称为“运行时数据区”的内存中。其中方法区、堆是JVM中所有线程共享的。当每创建一个新线程时,该线程都得到它自己的PC寄存器以及一个Java栈。它的PC寄存器存放该线程的下一条非本地指令地址,Java 栈保存该线程执行的非本地方法的状态——局部变量、参数、返回值等。本地方法(native method)的状态保存在本地方法栈中。下图描述了线程专有的数据区:

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多线程试题 答案

多线程 一.选择题 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.一个进程可以包含多个线程

Java多线程同步机制在售票系统的实现

Java多线程同步机制在售票系统的实现 论文导读:多线程技术的思想已经使用了很长的一段时间。但其不支持相同优先级的时间片轮换。多个用户线程在并发运行过程中可能同时访问临界区的内容。在Java中定义了线程同步的概念。关键词:多线程技术,多线程优先级,时间片,同步,临界区引言:多线程技术的思想已经使用了很长的一段时间,它允许CPU处理器时间共享,即很多用户可以共享处理器,每个用户的任务都分配到一段处理器时间。多线程是现代操作系统有别于传统操作系统的重要标志之一,它有别于传统的多进程的概念。所谓线程就是程序中的一个执行流,多线程程序是指一个程序中包含有多个执行流,多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发性的一个基本单位。1.基本概念:1.1线程与进程的主要区别:①同样作为基本的执行单元,线程的划分比进程小。②多进程每个占有独立的内存空间,而多线程共享同一内存空间,通过共享的内存空间来交换信息,切换效率远远高于多进程。③Java线程调度器支持不同优先级线程的抢占方式,但其不支持相同优先级的时间片轮换。④Java运行时系统所在的操作系统(例如:Windows XP)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。免费论文参考网。1.2Java 多线程的特点:1.2.1多线程的继承由于Java引入了包的概念,从而使类的继承更加简便,线程的创建就是一个最好的例子。Java多线程的实现有两种办法①通过Thread继承,在下面的研究中,我主要用继承自Thread类来实现Java的多线程技术。②通过Runnable接口。

1.2.2Java多线程的同步技术Java应用程序的多个线程共享同一进程的数据资源,多个用户线程在并发运行过程中可能同时访问临界区的内容,为了程序的正常运行,在Java中定义了线程同步的概念,实现对临界区共享资源的一致性的维护。1.3.3Java多线程的流程控制Java流程控制的方法有Sleep().Interrupt().Wait().Notif().Join()等。1.3.4临界区在一个多线程的程序当中,单独的并发的线程访问代码段中的同一对象,则这个代码段叫做临界区,我们需要用同步的机制对代码段进行保护,避免程序出现不确定的因素。1.3.5同步机制Java中支持线程的同步机制,它由synchronized方法实现,分为同步块和同步方法,在下面的讨论中用synchronized的同步块来解决问题。2.多线程同步机制在车票系统的实现2.1下面就以售票系统中所涉及的问题来讨论Java的多线程同步机制问题,在售票系统中由于很大一部分时间可能有多人在购买车票,所以必须开辟多个线程同时为他们服务,在这里我设有四个售票窗口,则开辟四个线程来为四个窗口服务模拟图如下:窗口 1 窗口2窗口 3 窗口4Thread1Thread2 Thread3Thread4售票窗口模拟图 2.2出错的程序代码如下:class TicketsSystem{public staticvoid main(String[] args){SellThread kt=new SellThread();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();}}class SellThreadextends Thread{inttickets=60;public voidrun(){while(true){if(tickets>0){System.out.println(Thread.currentThr ead().getName()+'sellticket '+tickets);tickets--;}}}}在上面的程序中为了

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用()机制实现了进程之间的异步执行

Thread Synchronization Java 线程同步

Thread Synchronization https://www.doczj.com/doc/7f4979395.html,/insidejvm/ed2/threadsynch.html One of the strengths of the Java programming language is its support for multithreading at the language level. Much of this support centers on synchronization: coordinating activities and data access among multiple threads. The mechanism that Java uses to support synchronization is the monitor. This chapter describes monitors and shows how they are used by the Java virtual machine. It describes how one aspect of monitors, the locking and unlocking of data, is supported in the instruction set. Monitors Java's monitor supports two kinds of thread synchronization: mutual exclusion and cooperation. Mutual exclusion, which is supported in the Java virtual machine via object locks, enables multiple threads to independently work on shared data without interfering with each other. Cooperation, which is supported in the Java virtual machine via the wait and notify methods of class Object, enables threads to work together towards a common goal. A monitor is like a building that contains one special room that can be occupied by only one thread at a time. The room usually contains some data. From the time a thread enters this room to the time it leaves, it has exclusive access to any data in the room. Entering the monitor building is called "entering the monitor." Entering the special room inside the building is called "acquiring the monitor." Occupying the room is called "owning the monitor," and leaving the room is called "releasing the monitor." Leaving the entire building is called "exiting the monitor." In addition to being associated with a bit of data, a monitor is associated with one or more bits of code, which in this book will be called monitor regions. A monitor region is code that needs to be executed as one indivisible operation with respect to a particular monitor. In other words, one thread must be able to execute a monitor region from beginning to end without another thread concurrently executing a monitor region of the same monitor. A monitor enforces this one-thread-at-a-time execution of its monitor regions. The only way a thread can enter a monitor is by arriving at the beginning of one of the monitor regions associated with that monitor. The only way a thread can move forward and execute the monitor region is by acquiring the monitor. When a thread arrives at the beginning of a monitor region, it is placed into an entry set for the associated monitor. The entry set is like the front hallway of the monitor building. If no other thread is waiting in the entry set and no other thread

java多线程题目

1、当多个线程共享某个资源时,为了确保在任何时间点一个共享资源只被一个线程使用,避免造成数据的不一致,需要使用线程同步机制,线程同步有几种方式?分别如何实现? 答:有两种方式: 第一种方式:使用同步方法 synchronized void methodA(){} 第二种方式:使用同步代码块 void methodA(){ synchronized{ } } 2、以下是一个模拟订票业务的程序。BookingClerk类代表自动售票员,其中包含一个订票(booking)方法。假设一开始有10张票可预定。程序运行时产生两个订票客户同时自动向自动售票员订票。请问会出现什么错误?该如何修改? (考点:临界区与互斥) public class Test { public static void main(String args[]) { BookingClerk bt = new BookingClerk(); new BookingTest(bt, 7); new BookingTest(bt, 5); } } class BookingClerk { int remainder = 10; void booking(int num) { if (num <= remainder) { System.out.println("预定" + num + "张票"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } remainder = remainder - num; } else { System.out.println("剩余票不够,无法预定"); } System.out.println("还剩"+remainder+"张票"); } } class BookingTest implements Runnable {

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同步实现方式

一、引言 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊。闲话不多说,进入正题。 二、为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常。举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚。因此多线程同步就是要解决这个问题。 三、不同步时的代码 Bank.java 1.packagethreadTest; 2. 3./** 4.*@authorww 5.* 6.*/ 7.publicclassBank{ 8. 9.privateintcount=0;//账户余额 10. 11.//存钱 12.publicvoidaddMoney(intmoney){ 13.count+=money; 14.System.out.println(System.currentTimeMillis()+"存进:"+money); 15.} 16. 17.//取钱 18.publicvoidsubMoney(intmoney){ 19.if(count-money<0){ 20.System.out.println("余额不足"); 21.return; 22.} 23.count-=money; 24.System.out.println(+System.currentTimeMillis()+"取出:"+money); 25.} 26. 27.//查询

JAVA中的同步与异步问题 线程和线程池的重要知识

java线程同步与异步线程池 java线程同步与异步线程池 1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲 系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求 不到,怎么办,A线程只能等待下去 异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程 仍然请求的到,A线程无需等待

显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个 进程崩溃,但没有同步机制的存在,性能会有所提升 java中实现多线程 1)继承Thread,重写里面的run方法 2)实现runnable接口 Doug Lea比较推荐后者,第一,java没有单继承的限制第二,还可以隔离代码 线程池 要知道在计算机中任何资源的创建,包括线程,都需要消耗系统资源的。在WEB服务中,对于web服 务器的响应速度必须要尽可能的快,这就容不得每次在用户提交请求按钮后,再创建线程提供服务 。为了减少用户的等待时间,线程必须预先创建,放在线程池中,线程池可以用HashTable这种数

据结构来实现,看了Apach HTTP服务器的线程池的源代码,用是就是HashTable,KEY 用线程对象, value用ControlRunnable,ControlRunnable是线程池中唯一能干活的线程,是它指派线程池中的 线程对外提供服务。 出于安全考虑,Apach HTTP服务器的线程池它是同步的。听说weblogic有异步的实现方式,没有研 究过,不敢确定 --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------一、关键字: thread(线程)、thread-safe(线程安全)、intercurrent(并发的) synchronized(同步的)、asynchronized(异步的)、 volatile(易变的)、atomic(原子的)、share(共享) 二、总结背景: 一次读写共享文件编写,嚯,好家伙,竟然揪出这些零碎而又是一路的知识点。于是乎,

java基础和高级测试题

一、选择题 1、下面哪个是Java语言中正确的标识符( C ) A、3com B、import C、that D、this 2、下面哪个语句(初始化数组)是不正确的:( B ) A.int x[] = {1,2,3}; B.int x[3] = {1,2,3}; C.int[] x = {1,2,3}; D.int x[] = new int[]{1,2,3}; 3、下述概念中不属于面向对象方法的是( D )。 A.对象、消息 B.继承、多态 C.类、封装 D.过程调用4、下面的代码段中,执行之后i 和j 的值是什么? ( B ) int i = 1; int j; j = i++*2+3*--i; A.1, 2 B.1, 5 C. 2, 1 D. 2, 2 5、下面哪条语句把方法声明为抽象的公共方法?( B ) A.public abstract method(); B.public abstract void method(); C.public abstract void method(){} D.public void method() extends abstract; 6、下面关于java中类的说法哪个是不正确的?( C ) A.类体中只能有变量定义和成员方法的定义,不能有其他语句。B.构造函数是类中的特殊方法。 C.类一定要声明为public的,才可以执行。 D.一个java文件中可以有多个class定义。 7、假设A类有如下定义,设a是A类的一个实例,下列语句调用哪个是错误的?( C ) class A { int i; static String s; void method1() { } static void method2() { } } A、System.out.println(a.i); B、a.method1(); C、A.method1(); D、 A.method2(); 8、容器被重新设置大小后,哪种布局管理器的容器中的组件大小不随容器大小 的变化而改变? ( B )

JAVA线程知识点总结

进程:是一个正在执行的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。 线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行。 一个进程中至少有一个线程。 JVM启动的时候会有一个进程java.exe,该进程至少有一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中,该线程成为主线程。 创建线程的方式: 1、继承Thread类 步骤: (1)、定义类继承Thread (2)、复写Thread类中的run方法 目的:将自定义的代码存储在run方法中,让线程运行。 (3)、调用线程的start方法,该方法有两个作用:启动线程,调用run方法。 2、创建线程的第二种方式:实现Runnable接口 步骤: *(1)、定义类实现Runnable接口 将线程要运行的代码存放在run方法中 (2)、覆盖Runnable接口中的run方法 (3)、通过Thread类建立线程对象 (4)、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数因为,自定义额run方法所属的对象是Runnable接口的子类对象,所以要让 线程去指定对象的run方法,就必须明确run方法所属对象。 (5)、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。 实现方式和继承方式的区别: 实现方式好处:避免了单继承的局限性,在定义线程时,建议使用实现方式。 继承Thread:线程代码存放在Thread子类run方法中,实现Runnable,线程代码存放在接口的run方法中。 发现运行结果每次都不同,因为多个线程都获取cpu的执行权,cpu执行到谁,谁就执行,在某一个时刻,只能有一个程序在运行(多核除外),cpu在做着快速的切换,以达到看上去是同时运行的效果,我们可以形象的把多线程的运行行为看成在互相抢夺cpu的执行权,这就是多线程的一个特性:随机性,谁抢到,谁执行,至于执行多长,cpu说了算。 Eg:创建两个线程,和主线程交替执行: class Test extends Thread { private String name; Test(String name) { https://www.doczj.com/doc/7f4979395.html,=name; } public void run() { for(int x=0;x<60;x++) {

关于线程同步(5种同步方式)

Java笔记--关于线程同步(5种同步方式) 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性。 1.同步方法 即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 代码如: public synchronized void save(){} 注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类 2.同步代码块 即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步 代码如: synchronized(object){ } 注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 代码实例:

package com.xhj.thread; /** * 线程同步的运用 * * @author XIEHEJUN * */ public class SynchronizedThread { class Bank { private int account = 100; public int getAccount() { return account; } /** * 用同步方法实现 * * @param money */ public synchronized void save(int money) { account += money; } /** * 用同步代码块实现 * * @param money */ public void save1(int money) {

关于java线程同步的详细讲解

我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的线程(Thread)。 线程(Thread)是一份独立运行的程序,有自己专用的运行栈。线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。 当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。 同步这个词是从英文synchronize(使同时发生)翻译过来的。我也不明白为什么要用这个很容易引起误解的词。既然大家都这么用,咱们也就只好这么将就。 线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。 因此,关于线程同步,需要牢牢记住的第一点是:线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。这可真是个无聊的绕口令。 关于线程同步,需要牢牢记住的第二点是“共享”这两个字。只有共享资源的读写访问才需要同步。如果不是共享资源,那么就根本没有同步的必要。 关于线程同步,需要牢牢记住的第三点是,只有“变量”才需要同步访问。如果共享的资源是固定不变的,那么就相当于“常量”,线程同时读取常量也不需要同步。至少一个线程修改共享资源,这样的情况下,线程之间就需要同步。 关于线程同步,需要牢牢记住的第四点是:多个线程访问共享资源的代码有可能是同一份代码,也有可能是不同的代码;无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。 为了加深理解,下面举几个例子。 有两个采购员,他们的工作内容是相同的,都是遵循如下的步骤: (1)到市场上去,寻找并购买有潜力的样品。 (2)回到公司,写报告。 这两个人的工作内容虽然一样,他们都需要购买样品,他们可能买到同样种类的样品,但是他们绝对不会购买到同一件样品,他们之间没有任何共享资源。所以,他们可以各自进行自己的工作,互不干扰。 这两个采购员就相当于两个线程;两个采购员遵循相同的工作步骤,相当于这两个线程执行同一段代码。 下面给这两个采购员增加一个工作步骤。采购员需要根据公司的“布告栏”上面公布的信息,安排自己的工作计划。 这两个采购员有可能同时走到布告栏的前面,同时观看布告栏上的信息。这一点问题都没有。因为布告栏是只读的,这两个采购员谁都不会去修改布告栏上写的信息。 下面增加一个角色。一个办公室行政人员这个时候,也走到了布告栏前面,准备修改布告栏上的信息。 如果行政人员先到达布告栏,并且正在修改布告栏的内容。两个采购员这个时候,恰好也到了。这两个采购员就必须等待行政人员完成修改之后,才能观看修改后的信息。 如果行政人员到达的时候,两个采购员已经在观看布告栏了。那么行政人员需要等待两个采购员把当前信息记录下来之后,才能够写上新的信息。 上述这两种情况,行政人员和采购员对布告栏的访问就需要进行同步。因为其中一个线程(行

Java线程总结

Java 线程总结
作者的 blog:()
在论坛上面常常看到初学者对线程的无可奈何,所以总结出了下面一篇文章,希望对一些正在学习使用 java 线程的初 学者有所帮助。
首 先 要 理 解 线 程 首 先 需 要 了 解 一 些 基 本 的 东 西 ,我 们 现 在 所 使 用 的 大 多 数 操 作 系 统 都 属 于 多 任 务 ,分 时 操 作 系 统 。正 是 由于这种操作系统的出现才有了多线程这个概念。我们使用的 windows,linux 就属于此列。什么是分时操作系统呢,通 俗一点与就是可以同一时间执行多个程序的操作系统,在自己的电脑上面,你是不是一边听歌,一边聊天还一边看网页 呢?但实际上,并不上 cpu 在同时执行这些程序,cpu 只是将时间切割为时间片,然后将时间片分配给这些程序,获得 时间片的程序开始执行,不等执行完毕,下个程序又获得时间片开始执行,这样多个程序轮流执行一段时间,由于现在 cpu 的高速计算能力,给人的感觉就像是多个程序在同时执行一样。 一 般 可 以在 同 一时 间 内执 行多 个 程 序的 操 作系 统 都有 进程 的 概 念 .一 个进 程 就是 一 个执 行 中 的程 序 ,而 每 一个 进 程都 有 自 己 独 立 的一 块 内存 空 间 ,一 组系 统 资 源 .在 进程 概 念中 ,每 一 个 进 程的 内 部数 据 和状 态都 是 完 全独 立 的 .因 此可 以 想像 创 建 并执行一个进程的系统开像是比较大的,所以线程出现了。在 java 中,程序通过流控制来执行程序流,程序中单个顺序 的 流 控 制称 为 线程 ,多 线 程 则指 的 是 在单 个 程序 中 可以 同时 运 行 多个 不 同的 线 程 ,执 行不 同 的 任务 .多 线 程 意味 着 一 个 程 序的多行语句可以看上去几乎在同一时间内同时运行 .(你可以将前面一句话的程序换成进程,进程是程序的一次执行过 程,是系统运行程序的基本单位)
线 程 与 进 程 相 似 ,是 一 段 完 成 某 个 特 定 功 能 的 代 码 ,是 程 序 中 单 个 顺 序 的 流 控 制 ;但 与 进 程 不 同 的 是 ,同 类 的 多 个 线 程 是 共 享一块内存空间和 一组系统 资源 ,而线程本身的 数据通常 只有微处理器的寄 存器数据 ,以及一个供程序执 行时使用 的堆栈 . 所 以 系 统 在 产 生 一 个 线 程 ,或 者 在 各 个 线 程 之 间 切 换 时 ,负 担 要 比 进 程 小 的 多 ,正 因 如 此 ,线 程 也 被 称 为 轻 负 荷 进 程 (lightweightprocess).一 个 进 程 中 可 以 包 含 多 个 线 程 .
多任务是指在一个系统中可以同时运行多个程序 ,即有多个独立运行的任务 ,每个任务对应一个进程,同进程一样 ,一个线 程 也 有 从 创 建 ,运 行 到 消 亡 的 过 程 ,称 为 线 程 的 生 命 周 期 .用 线 程 的 状 态 (state)表 明 线 程 处 在 生 命 周 期 的 哪 个 阶 段 .线 程 有 创建,可运行,运行中,阻塞,死亡五中状态.通过线程的控制与调度可使线程在这几种状态间转化每个程序至少自动拥有一 个 线 程 ,称 为 主 线 程 .当 程 序 加 载 到 内 存 时 ,启 动 主 线 程 .
-来源网络,仅供个人学习参考

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

7J a v a多线程机制7.1单项选择题 1. 线程调用了sleep()方法后,该线程将进入()状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 2. 关于 A. C. D. 3. 在 A. C. D. 4.在 5. A. B. C. D. 6. A. 当 B. C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时 C. 线程调用了yield()方法时 D. 以上都是 8. java用()机制实现了进程之间的异步执行 A. 监视器 B. 虚拟机 C. 多个CPU

D. 异步调用 9.Thread类的方法中,toString()方法的作用是() A. 只返回线程的名称 B. 返回当前线程所属的线程组的名称 C. 返回当前线程对象 D. 返回线程的名称 10.Java语言具有许多优点和特点,下列选项中,哪个反映了Java程序并行机制的特点() A. 安全性 B. 多线程 C. 跨平台 D. 可移值 11. 12. A B C.Java D 7.2 1. 2.因 3. 4. 5. 6. 7. 了 8.ava)转 换为_________。 9.多线程是java程序的________机制,它能同步共享数据,处理不同事件。 10.进程是由代码、数据、内核状态和一组寄存器组成,而线程是表示程序运行状态的______,如 程序计数器、栈指针以及堆栈组成。 11.Thread类提供了一系列基本线程控制方法,如果我们需要让与当前进程具有相同优先级的线程 也有运行的机会则可以调用________方法。 12.在多线程系统中,多个线程之间有________和互斥两种关系。 13. 在一个时间只能由一个线程访问的资源称为临界资源,访问临界资源的代码___________。

Java多线程同步机制下的网络售票系统

224 ?电子技术与软件工程 Electronic Technology & Software Engineering 程序设计 ? Program Design 【关键词】Java 多线程 同步机制 网络售票 多线程机制的引进体现在多个方面,如在计算机上的使用,人们可以在同时在一台计算上完成不同的工作,比如听歌、语音视频、图片搜索等任务。这些都可以通过多线程机制的出现来实现这个构想。多线程是Java 语言的重要特点之一多线程的意思就是说,对于不同的线程,它所要完成的任务基本上大不相同。同时同步机制用能够保证这些任务在同时进行的过程中,不会出现相互干扰和妨碍的情况。如网络售票,就是在这种机制下进行售票,实现了多个售票点同时售票,且互不干扰。 1 Java多线程机制的使用 1.1 Java中的多线程 Java 语言内置了多个线程的支持,因此才能实现几个相对独立的线程同时运行,这是一项比较发达的信息技术。多线程机制的实现主要靠的是Java 虚拟机,这是非常复杂的程序运作,每次当程序启动的时候虚拟机也会跟着程序的启动而启动,接着会加载出主要的方法代码,虽然过程比较的曲折,但在接着就是所谓的“主线程”即将首先启动。但是很有可能在加载方法代码的时候出现了其他的线程,这些线程不会去占据主线程的位置,而是各自的独立存在。这时候Java 的作用就显现出来了,它同时切换主线程和其他的线程,来保证每一 Java 多线程同步机制下的网络售票系统 文/王敏 个线程都有机会来获得线程代码的执行,同时 使用CPU 资源,完成任务。1.2 多线程机制的实现 在Java 语言中,创建线程的最主要的方法主要有两种,第一种就是通过Thread 类的子类来创建线程,对于这个方法,在开发的过程中由于受到多重的限制,在进行多个线程共享资源时可能会出现问题,所以不太适合用这一种方法。对于第二种就是通过实现Runnable 接口来实现创建线程的目的,对于种种方法,优点比较明显,灵活性好、还能够实现资源的共享。所以在进行网络售票时用的就是第二种方法。网络售票是可以在多个售票点同时进行售票,每一个售票点的活动都可以看成是一个 线程,但是,在运行的过程中发现了一些问题,就是比如两个大不相同的售票点售得票是一样的,但是卖出的时候可能两个人买的同一张票, 或者是票已经被售完,但在网上显示的还是售票中。所以为了解决这些问题,引入了多线程的同步机制。 2 多线程的同步机制的使用 2.1 多线程同步机制的概念 所谓多线程同步机制是在多线程机制之下发展和完善起来的,这种机制即在一个线程对变量进行访问时,其他的多个线程被禁止访问这个变量,这样既能够做到多个线程同时启动,但在启动之后,不允许多个线程对如同一个变量同时进行访问,这样出现的问题也就得 到了解决,系统的效率得到提高,在工作过程中,一些原来的问题都不会再出现,系统的负担变小,效率更高。 2.2 多线程同步机制在网络售票系统中的应用 如今人们的生活水平不断地提高,人们娱乐的方式也在增加电影院作为其中重要的一部分,数量在逐渐增加。网络系统的发展,能够让人们在家中也能够完成对电影票的购买,既方便又便宜。所以多线程同步机制应用在网络售票系统中是非常有必要的。网络售票系统中,每一个售票点都可以作为一个线程,而待售的票就被视为共享的资源,在开始售票之前,首先要做的就是一个线程应该取得改票的绝对 拥有权,在票被卖出之后,就可以及时的通知其他的售票点,及时更改和完善网络信息。多线程同步机制在网络售票系统之中应用之后,解决了一个大问题,方便人们在进行电影票的 购买时得到公平的对待,如果没有同步机制的引进,在购票时会出现两个人同时购买一张票的情况,在处理这类问题的时候,电影院会因为顾客的电影票所有权而焦头烂额,影响影院在顾客心中的形象,也会影响电影院的正常营业,造成一定的损失。 3 结束语 总而言之,Java 多线程同步机制的引入,使得网络售票系统的问题得到解决,方便了顾客,也对电影院有好处。多线程对同一资源进行访问得到了限制,可以使共享资源同时进行访问,但是又可以防止线程的占用问题。多线程同步机制的应用,防止了同一张票被几个售票点同时卖出的问题。因此不只是网络售票系统,在其他的领域,只要合理的使用多线程同步机制,不仅可以提高资源共享的安全性,也能够提高系统的执行效率。无论对各个行业的发展都有极大的帮助。如今已是网络信息化时代,因此系统的完善和发展必不可少,而多线程同步机制的出现正好是发展的一个机遇也可 说是挑战,合理的对其利用和发展,一定促使我国的信息化水平得到一个很大的提高。 参考文献 [1]耿乡义,张跃平.Java 程序设计实用教程 [M].北京:人民邮电出版社,2015:55-56.[2]吴红萍.Java 的多线程机制分析与应用 [J].软件导刊,2014(01):114-116.[3]李青,王江平,朱浩,等.Java 多 线程编程的教学研究[J].计算机教育,2015(12):65-68. 作者简介 王敏(1983-),女,山西省晋中市人。大学本科学历。讲师。研究方向为计算机科学技术,从事的工作为教学。 作者单位 山西省物流技术学校 山西省太原市 030031

相关主题
文本预览
相关文档 最新文档