java多线程总结
来源:互联网 发布:betterfps用什么算法 编辑:程序博客网 时间:2024/06/01 07:18
1.Java多线程(全)学习笔记(下) http://blog.csdn.net/cloudyxuq/article/details/6941588
2.Java多线程学习笔记 http://huagenli.iteye.com/blog/511414
3.Java多线程随笔 http://www.cnblogs.com/justprograme/category/421845.html
5.Java多线程学习笔记 http://www.cnblogs.com/justprograme/archive/2012/10/22/2734182.html
6.java多线程编程 http://www.cnblogs.com/justprograme/archive/2012/10/22/2733984.html
1. runnable和Thread操作共享数据的区别
2. 线程同步指多个线程同时操作同一个类实例而言的,同一类的不同类实例的相同方法是不存在共享/同步问题的(可以理解为:同类的不同实例的代码块是不同的),所以同步问题存在着以下几种可能:
a. 不同线程对同一个实例进行操作
b. 不同线程共享一个静态对象(多个线程共享一段代码)/**=============================================================================
* 文件:ThreadDemo_05.java
* 描述:多线程不同步的解决方法--锁
* =============================================================================
*/
// 共享一个静态数据对象
class ShareData{
public static String szData = "";
}
class ThreadDemo extends Thread{
private ShareData oShare;
ThreadDemo(){
}
ThreadDemo(String szName,ShareData oShare){
super(szName);
this.oShare = oShare;
}
public void run(){
// 为了更清楚地看到不正确的结果,这里放一个大的循环
for (int i = 0; i < 50; i++){
if (this.getName().equals("Thread1")){
// 锁定oShare共享对象
synchronized (oShare){
oShare.szData = "这是第 1 个线程";
// 为了演示产生的问题,这里设置一次睡眠
try{
Thread.sleep((int)Math.random() * 100);
catch(InterruptedException e){
}
// 输出结果
System.out.println(this.getName() + ":" + oShare.szData);
}
}else if (this.getName().equals("Thread2")){
// 锁定共享对象
synchronized (oShare){
oShare.szData = "这是第 1 个线程";
// 为了演示产生的问题,这里设置一次睡眠
try{
Thread.sleep((int)Math.random() * 100);
catch(InterruptedException e){
}
// 输出结果
System.out.println(this.getName() + ":" + oShare.szData);
}
}
}
}
class ThreadMain{
public static void main(String argv[]){
ShareData oShare = new ShareData();
ThreadDemo th1 = new ThreadDemo("Thread1",oShare);
ThreadDemo th2 = new ThreadDemo("Thread2",oShare);
th1.start();
th2.start();
}
}
c. 不同线程对同一数据进行操作(类似a)/* ==================================================================================
* 文件:ThreadDemo08.java
* 描述:生产者--消费者
* ==================================================================================
*/
class ShareData{
private char c;
// 通知变量
private boolean writeable = true;
// -------------------------------------------------------------------------
// 需要注意的是:在调用wait()方法时,需要把它放到一个同步段里,否则将会出现
// "java.lang.IllegalMonitorStateException: current thread not owner"的异常。
// -------------------------------------------------------------------------
public synchronized void setShareChar(char c){
if (!writeable){
try{
// 未消费等待
wait();
}catch(InterruptedException e){}
}
this.c = c;
// 标记已经生产
writeable = false;
// 通知消费者已经生产,可以消费
notify();
}
public synchronized char getShareChar(){
if (writeable){
try{
// 未生产等待
wait();
}catch(InterruptedException e){}
}
// 标记已经消费
writeable = true;
// 通知需要生产
notify();
return this.c;
}
}
// 生产者线程
class Producer extends Thread{
private ShareData s;
Producer(ShareData s){
this.s = s;
}
public void run(){
for (char ch = 'A'; ch <= 'Z'; ch++){
try{
Thread.sleep((int)Math.random() * 400);
}catch(InterruptedException e){}
s.setShareChar(ch);
System.out.println(ch + " producer by producer.");
}
}
}
// 消费者线程
class Consumer extends Thread{
private ShareData s;
Consumer(ShareData s){
this.s = s;
}
public void run(){
char ch;
do{
try{
Thread.sleep((int)Math.random() * 400);
}catch(InterruptedException e){}
ch = s.getShareChar();
System.out.println(ch + " consumer by consumer.**");
}while (ch != 'Z');
}
}
class Test{
public static void main(String argv[]){
ShareData s = new ShareData(); //共用的数据类
new Consumer(s).start();
new Producer(s).start();
}
}
2.Java多线程学习笔记 http://huagenli.iteye.com/blog/511414
3.Java多线程随笔 http://www.cnblogs.com/justprograme/category/421845.html
5.Java多线程学习笔记 http://www.cnblogs.com/justprograme/archive/2012/10/22/2734182.html
6.java多线程编程 http://www.cnblogs.com/justprograme/archive/2012/10/22/2733984.html
1. runnable和Thread操作共享数据的区别
总结:根据源代码中Thread类构造方法 Ruanalbe接口对象target只能作为参数传递到Thread构造方法中,所以多个线程可以共用一个Runnable对象,因为都用同一个Runnable对象所以在Runnable实现类的实例变量也可以共享了。
所以Runable非常适合多个相同线程来处理同一份资源的情况。
总结 :从上面结果可以看出由同一个FirstThread类生成的Thread-0和Thread-1两条线程实例,输出的i变量都不连续(注意:i变量是FirestThread的实例属性,而不是局部变量,但因为程序每次创建线程都会创建一个FirstThread对象,所以Thread-0和Thread-1不能共享该实例属性)。
使用继承Thread类的方法来创建线程类,多条线程之间无法共享线程类的实例变量。
2. 线程同步指多个线程同时操作同一个类实例而言的,同一类的不同类实例的相同方法是不存在共享/同步问题的(可以理解为:同类的不同实例的代码块是不同的),所以同步问题存在着以下几种可能:
a. 不同线程对同一个实例进行操作
- public class Test {
- public static void main(String []args){
- //创建一个用户没余额,等待先存款后取钱
- Account acct=new Account("123张",0); //不同线程对同一个实例进行操作
- //取款800
- new Thread(new DrawThread(acct,800),"取款者").start();
- //存款2个人
- new Thread(new DepositThread(acct,800),"存款者甲").start();
- new Thread(new DepositThread(acct,800),"存款者乙").start();
- new Thread(new DepositThread(acct,800),"存款者丙").start();
- }
- }
b. 不同线程共享一个静态对象(多个线程共享一段代码)/**=============================================================================
* 文件:ThreadDemo_05.java
* 描述:多线程不同步的解决方法--锁
* =============================================================================
*/
// 共享一个静态数据对象
class ShareData{
public static String szData = "";
}
class ThreadDemo extends Thread{
private ShareData oShare;
ThreadDemo(){
}
ThreadDemo(String szName,ShareData oShare){
super(szName);
this.oShare = oShare;
}
public void run(){
// 为了更清楚地看到不正确的结果,这里放一个大的循环
for (int i = 0; i < 50; i++){
if (this.getName().equals("Thread1")){
// 锁定oShare共享对象
synchronized (oShare){
oShare.szData = "这是第 1 个线程";
// 为了演示产生的问题,这里设置一次睡眠
try{
Thread.sleep((int)Math.random() * 100);
catch(InterruptedException e){
}
// 输出结果
System.out.println(this.getName() + ":" + oShare.szData);
}
}else if (this.getName().equals("Thread2")){
// 锁定共享对象
synchronized (oShare){
oShare.szData = "这是第 1 个线程";
// 为了演示产生的问题,这里设置一次睡眠
try{
Thread.sleep((int)Math.random() * 100);
catch(InterruptedException e){
}
// 输出结果
System.out.println(this.getName() + ":" + oShare.szData);
}
}
}
}
class ThreadMain{
public static void main(String argv[]){
ShareData oShare = new ShareData();
ThreadDemo th1 = new ThreadDemo("Thread1",oShare);
ThreadDemo th2 = new ThreadDemo("Thread2",oShare);
th1.start();
th2.start();
}
}
c. 不同线程对同一数据进行操作(类似a)/* ==================================================================================
* 文件:ThreadDemo08.java
* 描述:生产者--消费者
* ==================================================================================
*/
class ShareData{
private char c;
// 通知变量
private boolean writeable = true;
// -------------------------------------------------------------------------
// 需要注意的是:在调用wait()方法时,需要把它放到一个同步段里,否则将会出现
// "java.lang.IllegalMonitorStateException: current thread not owner"的异常。
// -------------------------------------------------------------------------
public synchronized void setShareChar(char c){
if (!writeable){
try{
// 未消费等待
wait();
}catch(InterruptedException e){}
}
this.c = c;
// 标记已经生产
writeable = false;
// 通知消费者已经生产,可以消费
notify();
}
public synchronized char getShareChar(){
if (writeable){
try{
// 未生产等待
wait();
}catch(InterruptedException e){}
}
// 标记已经消费
writeable = true;
// 通知需要生产
notify();
return this.c;
}
}
// 生产者线程
class Producer extends Thread{
private ShareData s;
Producer(ShareData s){
this.s = s;
}
public void run(){
for (char ch = 'A'; ch <= 'Z'; ch++){
try{
Thread.sleep((int)Math.random() * 400);
}catch(InterruptedException e){}
s.setShareChar(ch);
System.out.println(ch + " producer by producer.");
}
}
}
// 消费者线程
class Consumer extends Thread{
private ShareData s;
Consumer(ShareData s){
this.s = s;
}
public void run(){
char ch;
do{
try{
Thread.sleep((int)Math.random() * 400);
}catch(InterruptedException e){}
ch = s.getShareChar();
System.out.println(ch + " consumer by consumer.**");
}while (ch != 'Z');
}
}
class Test{
public static void main(String argv[]){
ShareData s = new ShareData(); //共用的数据类
new Consumer(s).start();
new Producer(s).start();
}
}
0 0
- 【多线程】java多线程知识点总结
- java多线程使用总结
- Java多线程编程总结
- Java多线程编程总结
- Java多线程编程总结
- java多线程学习总结
- Java多线程编程总结
- Java多线程编程总结
- java多线程学习总结
- Java多线程编程总结
- Java多线程编程总结
- Java多线程编程总结
- Java多线程编程总结
- Java多线程编程总结
- Java多线程编程总结
- Java 多线程总结
- Java多线程编程总结
- Java多线程编程总结
- STL map的使用
- OpenCV_grabcut 抠图效果
- 第十九周项目四:点和距离
- tomcat配置入门和配置多个项目
- 单例模式要点、实例
- java多线程总结
- QTP常见操作方法
- android全局变量设置——Application使用
- 一个很好的电子书下载网站
- Highcharts学习笔记之一——饼图
- 智能电视应用适配指南
- 类加载器
- 巧用批处理和reg文件制作“假”病毒,请勿乱用
- 最短路 Dijkstra