- 浏览: 117377 次
- 性别:
- 来自: 福建
文章分类
最新评论
-
wenbing2610:
其实用Struts实现图片上传比用Servlet实现容易多了。 ...
Struts2文件上传深入FileUploadInterceptor -
i_feng:
public class uploadImageAction ...
Struts2文件上传深入FileUploadInterceptor -
wenbing2610:
...
ognl.MethodFailedException
目录:
1 synchronized的作用域
2 线程的状态及线程类的一些常用方法:
3 一个简单多线程通信的例子:
1 synchronized的作用域:
假设存在如下条件:2个线程(ThreadOne and ThreadTwo),1个类(TestObject), 3个TestObject的实例(object, object1 and object2).
构造函数如下:
ThreadOne threadOne = new ThreadOne(object1)
ThreadTwo threadTwo = new ThreadTwo(object2)
TestObject testObject = new TestObject ("object")
TestObject.java
String getName();
void setName();
现在我们分作用域为:实例内,整个对象,代码块,子类实例内:只有一个实例的情况下(设ThreadOne和ThreadTwo都是通过object来构造的,TestObject的2个方法均由synchronized修饰) ,当ThreadOne在调用getName()的时候,ThreadTwo是没有权利调用object这个实例的所有用synchronized方法。即对这个实例object上锁了。只有等到ThreadOne执行完getName()方法的时候ThreadTwo才可以调用setName()方法;
整个对象:如果存在2个实例object1和object2,并且分别用来构造ThreadOne和ThreadTwo。那么ThreadOne和ThreadTwo调用TestObject内的所有synchronized方法是相互独立不受影响的。但是如果用synchronized static来修饰方法情况就不一样了,这样是整个TestObject对象被上锁了,只要它的一个实例调用了synchronized static方法,其他所有的实例都不能调用任何synchronized static方法;
代码块:除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;
子类: synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
2 线程的状态以及线程的常用方法:
线程的状态有就绪状态,运行状态,等待状态,休眠状态,终止状态,当条件齐备的时候就绪状态的线程就会开始执行。
wait()/notify()/notifyAll(): wait()之后线程释放锁进入等待状态,就绪状态的线程才可以利用锁;进入等待状态的线程只有通过notify()/notifyAll()才能够被唤醒(当条件发生变化)。和synchronized连用。
sleep(): 不释放琐,只是作一段时间的休眠,休眠完后继续执行。
yield(): 释放锁,使当前线程马上回到就绪状态,也可能马上在执行。
3 一个简单多线程通信的例子:
---------------------------------------------------
package com.kelin1314;
public class TestObject {
private String name;
private boolean flag = true;
public TestObject(String name) {
this.name = name;
}
public synchronized String getName() {
try {
System.out.println("begin get");
while (!flag) {
wait();
}
flag = true ? (flag = false) : (flag = true);
System.out.println("over get");
notify();
} catch (Exception e) {
e.printStackTrace();
}
return name;
}
// public synchronized static void setName(String name) {
public synchronized void setName(String name) {
try {
System.out.println("begin set");
while (flag) {
wait();
}
flag = true ? (flag = false) : (flag = true);
System.out.println("over set");
notify();
} catch (Exception e) {
e.printStackTrace();
}
}
}
---------------------------------------------------
package com.kelin1314;
/**
* This thread is used to test the variable scope of key word "synchronized".
*
* @author Administrator
*
*/
public class TestThreadOne extends Thread {
private TestObject object;
public TestThreadOne(TestObject object) {
this.object = object;
}
@Override
public void run() {
while (true) {
object.getName();
}
}
}
--------------------------------------------------
package com.kelin1314;
public class TestThreadTwo extends Thread{
private TestObject object;
public TestThreadTwo(TestObject object){
this.object = object;
}
@Override
public void run() {
while(true){
object.setName("two");
}
}
}
---------------------------------------------
package com.kelin1314;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
TestObject object = new TestObject("object");
TestThreadOne testThreadOne = new TestThreadOne(object);
TestThreadTwo testThreadTwo = new TestThreadTwo(object);
testThreadOne.start();
testThreadTwo.start();
}
}
----------------------------------------------------
1 synchronized的作用域
2 线程的状态及线程类的一些常用方法:
3 一个简单多线程通信的例子:
1 synchronized的作用域:
假设存在如下条件:2个线程(ThreadOne and ThreadTwo),1个类(TestObject), 3个TestObject的实例(object, object1 and object2).
构造函数如下:
ThreadOne threadOne = new ThreadOne(object1)
ThreadTwo threadTwo = new ThreadTwo(object2)
TestObject testObject = new TestObject ("object")
TestObject.java
String getName();
void setName();
现在我们分作用域为:实例内,整个对象,代码块,子类实例内:只有一个实例的情况下(设ThreadOne和ThreadTwo都是通过object来构造的,TestObject的2个方法均由synchronized修饰) ,当ThreadOne在调用getName()的时候,ThreadTwo是没有权利调用object这个实例的所有用synchronized方法。即对这个实例object上锁了。只有等到ThreadOne执行完getName()方法的时候ThreadTwo才可以调用setName()方法;
整个对象:如果存在2个实例object1和object2,并且分别用来构造ThreadOne和ThreadTwo。那么ThreadOne和ThreadTwo调用TestObject内的所有synchronized方法是相互独立不受影响的。但是如果用synchronized static来修饰方法情况就不一样了,这样是整个TestObject对象被上锁了,只要它的一个实例调用了synchronized static方法,其他所有的实例都不能调用任何synchronized static方法;
代码块:除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;
子类: synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
2 线程的状态以及线程的常用方法:
线程的状态有就绪状态,运行状态,等待状态,休眠状态,终止状态,当条件齐备的时候就绪状态的线程就会开始执行。
wait()/notify()/notifyAll(): wait()之后线程释放锁进入等待状态,就绪状态的线程才可以利用锁;进入等待状态的线程只有通过notify()/notifyAll()才能够被唤醒(当条件发生变化)。和synchronized连用。
sleep(): 不释放琐,只是作一段时间的休眠,休眠完后继续执行。
yield(): 释放锁,使当前线程马上回到就绪状态,也可能马上在执行。
3 一个简单多线程通信的例子:
---------------------------------------------------
package com.kelin1314;
public class TestObject {
private String name;
private boolean flag = true;
public TestObject(String name) {
this.name = name;
}
public synchronized String getName() {
try {
System.out.println("begin get");
while (!flag) {
wait();
}
flag = true ? (flag = false) : (flag = true);
System.out.println("over get");
notify();
} catch (Exception e) {
e.printStackTrace();
}
return name;
}
// public synchronized static void setName(String name) {
public synchronized void setName(String name) {
try {
System.out.println("begin set");
while (flag) {
wait();
}
flag = true ? (flag = false) : (flag = true);
System.out.println("over set");
notify();
} catch (Exception e) {
e.printStackTrace();
}
}
}
---------------------------------------------------
package com.kelin1314;
/**
* This thread is used to test the variable scope of key word "synchronized".
*
* @author Administrator
*
*/
public class TestThreadOne extends Thread {
private TestObject object;
public TestThreadOne(TestObject object) {
this.object = object;
}
@Override
public void run() {
while (true) {
object.getName();
}
}
}
--------------------------------------------------
package com.kelin1314;
public class TestThreadTwo extends Thread{
private TestObject object;
public TestThreadTwo(TestObject object){
this.object = object;
}
@Override
public void run() {
while(true){
object.setName("two");
}
}
}
---------------------------------------------
package com.kelin1314;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
TestObject object = new TestObject("object");
TestThreadOne testThreadOne = new TestThreadOne(object);
TestThreadTwo testThreadTwo = new TestThreadTwo(object);
testThreadOne.start();
testThreadTwo.start();
}
}
----------------------------------------------------
发表评论
-
XML小结
2013-09-21 23:27 743一、XML ... -
HashSet集合
2013-09-21 22:52 660HashSet集合是如何 ... -
Java中堆与栈的区别
2013-09-21 22:24 690栈与堆都是Java用来在RAM中存放数据的地 ... -
Write to programmer
2012-12-29 20:16 849很多的java初级程序员对自己没有一个明确的方 ... -
设计模式之--策略模式
2012-12-15 12:59 772... -
java中内存的分配
2012-10-03 16:16 842java中内存的分配 ... -
java加密、解密
2012-08-10 18:17 841简单demo: Java代码 impo ... -
GCLIB代理
2012-06-14 23:39 1016CGLib (Code Gene ... -
jdk1.5之后新特性总结
2012-05-30 22:41 986jdk1.5之后的一些新特性,特此总结一 ... -
comparable和comparator的区别
2012-05-30 22:36 968两者区别 ... -
Java动态代理的理解
2012-05-13 22:22 872Java动态代理类位于java.lang ... -
多线程下载
2012-05-05 23:31 870线程可以理解为下载的通道,一个线程就是一 ... -
基于TCP协议的网络编程
2012-03-11 22:59 1245TCP/IP通信协议是一种可靠地网络协议,它在 ... -
线程同步--同步锁
2012-03-01 21:34 948从JDK1.5之后,Java提供了另外一种线程同 ... -
线程同步--同步方法
2012-03-01 21:03 1000与同步代码块对应的,Java的多线程安全支持 ... -
线程同步--同步代码块
2012-03-01 20:36 1243多线程编程是有趣的事情,当常常容易突然出现“ ... -
Java线程同步机制
2012-02-24 23:21 11061、多线程的同步: 1.1、同步机制: 在多线程中,可能有多个 ...
相关推荐
这个"Java线程通信示例源代码"很可能包含了演示如何在不同线程之间共享数据和协调执行顺序的实例。线程通信主要涉及两个核心概念:同步和互斥。 1. **线程同步**:线程同步是为了防止多个线程同时访问共享资源,...
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
Java线程通信是多线程编程中的一个重要概念,它涉及到如何在并发执行的线程间交换信息或协调工作。在Java中,线程通信主要通过共享内存和消息传递两种方式来实现。本课程设计旨在深入理解和实践Java线程通信机制,以...
Java 线程通信是 Java 编程中一个非常重要的概念,它可以使得多个线程之间能够相互通信和协作,从而实现更加复杂的任务。下面我们将深入理解 Java 线程通信的机制和实现方式。 一、等待通知机制 等待通知机制是 ...
JAVA 线程通信相关知识汇总 JAVA 线程通信是指在 JAVA 多线程环境下,多个线程之间的协作和交互,以达到共同完成任务的目标。JAVA 线程通信相关知识汇总主要介绍了 JAVA 线程通信相关知识,文中讲解非常细致,代码...
Java TCP多线程通信是网络编程中的一个重要概念,它结合了Java的Socket编程与多线程技术,使得多个客户端能够同时与服务器进行交互。在Java中,TCP(传输控制协议)提供了一种可靠的数据传输方式,确保数据的有序、...
本源代码是博客《Java 多线程编程之六:线程之间的通信(附源代码)》附带的实例性源代码。原博客链接地址:http://blog.csdn.net/defonds/archive/2010/01/26/5257301.aspx。
Java多线程通信机制是Java程序设计中的一个复杂技术,涉及到多个线程之间的通信和协作。多线程是一种程序运行机制,它允许在程序中并发执行多个指令流,每个指令流都被称为一个线程,彼此间互相独立。 多线程之间的...
总的来说,Java多线程通信是一个复杂而重要的主题,涉及并发控制、线程安全、同步机制等多个方面。通过深入理解并熟练运用这些知识,开发者可以构建出高效、可靠的服务器多线程应用程序。在实际操作中,不断实践和...
下面将围绕“Java线程”这一主题展开详细的介绍与解释。 ### Java线程基础 在Java语言中,线程是程序执行流的基本单元。一个标准的Java应用程序至少会有一个线程,即主线程,用于执行程序的主要逻辑。通过创建多个...
线程通信是多线程编程中一个关键的组成部分,它确保线程间能有效地协同工作,避免竞争条件和死锁等问题。在Java中,线程通信主要依赖于共享内存和内置的等待/通知机制。 首先,线程通过共享对象通信是一种常见的...
总的来说,Java线程通信安全问题主要涉及如何有效地管理共享资源,确保线程间的协作无误。通过wait()、notify()和notifyAll()方法,我们可以实现复杂的线程同步策略,解决并发编程中的诸多挑战。在实际开发中,应...
Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的使用,帮助开发者掌握这一关键技术。 一、线程基础 1. **线程的概念**:线程...
"深入理解Java 线程通信" Java 线程通信是指在 Java 编程语言中,多个线程之间如何进行交流和协作的机制。Java 提供了多种机制来实现线程间的通信,包括使用 wait()、notify() 和 notifyAll() 方法,使用同步锁和 ...
Java线程同步与通信是多线程编程中的关键概念,用于解决并发访问共享资源时可能出现的数据不一致性和竞态条件问题。以下将详细介绍这两个主题,以及如何通过代码示例进行演示。 1. **线程同步**: 线程同步是确保...
五、线程通信 Java提供了wait()、notify()和notifyAll()方法进行线程间的通信,但这需要在同步控制块(synchronized)中使用。Java 5引入了BlockingQueue阻塞队列,提供了一种更安全的线程间通信方式,如...
Java线程通信是多线程编程中的一个关键概念,它涉及到如何在并发执行的线程之间交换信息。在Java中,线程通信主要通过共享内存和消息传递两种方式实现。以下将详细介绍这两种通信机制以及相关的Java API。 1. 共享...
Java线程是Java编程中的重要概念,特别是在多核处理器和并发处理中不可或缺。Java线程允许程序在同一时间执行多个不同的任务,从而提高了程序的效率和响应性。在燕山大学信息学院计算机系的课程中,李峰教授讲解了...
《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...
本文将详细介绍两种常见的Java线程通信方式:同步和while轮询。 1. 同步(Synchronized) 同步是Java中控制线程并发的一种手段,它通过`synchronized`关键字实现。在Java中,同步主要有两种形式:同步方法(通过在...