- 浏览: 337094 次
- 性别:
- 来自: 广州
文章分类
最新评论
目录:
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();
}
}
http://www.cnblogs.com/kelin1314/archive/2010/07/31/1789324.html
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();
}
}
http://www.cnblogs.com/kelin1314/archive/2010/07/31/1789324.html
发表评论
-
Mina重连
2014-05-26 21:29 2906import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6351.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 591一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 774安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1227使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 449ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1145http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 899不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 858http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 500http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 986http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 671http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 599http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 807http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 941http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 411http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 564http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 833当Server没接受到一个Client连接请求之后,都把处理流 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ... -
Java多线程之消费者生产者模式
2012-07-09 22:27 853/*@author shijin * 生产者与消费者模 ...
相关推荐
很简单的一个java多线程例子,希望多大家有帮助
Java 多线程例子 Java 多线程是 Java 编程语言中的一种基本概念,它允许程序同时执行多个任务,从而提高程序的性能和效率。本文将通过三个实用的例子,讲解 Java 多线程的基本概念和使用方法。 第一个例子:创建多...
根据提供的文件信息,我们可以归纳出以下关于Java多线程的经典示例中的关键知识点: ### Java多线程实现方式 在Java中,实现多线程有两种主要的方法:通过继承`Thread`类或者实现`Runnable`接口。 #### 继承...
在Java多线程编程中,理解如何创建和...总的来说,这个例子展示了Java多线程的基本操作,包括创建、启动、管理和通信。理解和掌握这些概念对于进行并发编程是至关重要的,可以帮助开发者构建高效、稳定的多线程应用。
在给定的代码示例中,我们首先看到的是一个简单的Java多线程应用实例。这个例子展示了如何创建并启动一个新的线程。在`ThreadDemo`类的`main`方法中,我们创建了一个名为`TestThread`的新线程,并调用了它的`start()...
在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。
这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...
Java多线程是Java编程中一个重要的概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,可以通过继承`Thread`类或实现`Runnable`接口来创建多线程。在这个例子中,我们将探讨如何通过自定义...
### Java多线程编程详解与实战案例 #### 理解多线程概念与Java内存模型 多线程,作为现代编程中的一项关键技术,允许在单一应用程序中并发执行多个指令流,每个这样的指令流被称为一个线程。在Java中,线程被视为...
总的来说,Java多线程提供了丰富的功能,包括线程的创建、启动、中断、同步以及异常处理等。通过合理利用这些工具,开发者可以构建出高效、稳定且响应迅速的多线程应用程序。在实际编程中,要特别注意线程安全和性能...
5. **线程优先级**:每个线程都有一个优先级,Java中从1(`MIN_PRIORITY`)到10(`MAX_PRIORITY`),默认优先级是5(`NORM_PRIORITY`)。但优先级并不保证线程的执行顺序,它只是影响调度策略。 6. **线程池**:`...
### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...
总之,Java多线程和异步调用是构建高效、响应迅速的应用程序的关键技术。通过合理利用这些工具和机制,开发者可以编写出能够充分利用多核处理器优势的代码,从而提高软件性能。在实际应用中,理解并熟练掌握这些概念...
在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。
Java 多线程访问的经典例子,一个个代码 手动敲出,可以加深或理解 多线程访问 线程安全与同步的问题.
一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送...
现在,让我们来看一个简单的订票系统的Java多线程示例。假设我们有一个票务系统,其中的`TicketService`类包含一个`tickets`变量表示剩余票数: ```java public class TicketService { private int tickets = 100;...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...
Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...