文档章节

多线程小问题

大强森
 大强森
发布于 2017/04/10 22:19
字数 811
阅读 8
收藏 0
多线程创建一般常见两种:
	一.自定义类,实现Runnable接口,复写run()方法
	二.自定义类,继承自Thread类,复写run()方法
	
	我发现有个绊脚石,需要注意,不是自定义类run()方法这块,而是创建自定义类对象,启动线程这块.
	以售票为例子.
	一.第一个方法多线程创建:
		1:
		// 一个对象的三个线程,不会有问题
		// MyRunnable1 m = new MyRunnable1();
		// Thread t1 = new Thread(m, "窗口1");
		// Thread t2 = new Thread(m, "窗口2");
		// Thread t3 = new Thread(m, "窗口3");
		// t1.start();
		// t2.start();
		// t3.start();
	这种情况是创建一个进程(创建一个对象),之后在进程内创建3个线程,并启动,这个情况下,
    run()方法没问题(即上锁解锁正当),线程就没问题.
	但是:
		2:
		// 三个对象中的每个对象一个线程,会有问题
		// Thread t1 = new Thread(new MyRunnable1(), "窗口1");
		// Thread t2 = new Thread(new MyRunnable1(), "窗口2");
		// Thread t3 = new Thread(new MyRunnable1(), "窗口3");
		// t1.start();
		// t2.start();
		// t3.start();
	这是创建三个进程(即创建三个匿名对象),每个进程都拥有一个线程,那这种情况,即使你run()方法内
部是没问题的,程序也会出问题.
	这种情况,谈不上多个线程同一个时刻干活的问题(即并发问题),只能谈得上进程(对象)并行问题.所以,
对于喜欢用匿名对象的人,要留意下了.匿名对象用完就是垃圾,随时可以被垃圾回收器回收,确实是谁用谁爽的感觉.

	二.第二个方法多线程创建:
		1:
		// 一个对象三个线程? (做不到这种情况)
		// MyThread t = new MyThread();
		// t.start();
		做不到这种情况了.
		
		2:
		// 三个对象,三个线程 (会有问题)
		// MyThread t1 = new MyThread();
		// MyThread t2 = new MyThread();
		// MyThread t3 = new MyThread();
		// t1.setName("窗口1");
		// t2.setName("窗口2");
		// t3.setName("窗口3");
		// t1.start();
		// t2.start();
		// t3.start();
		这个和第一种方法的2是一样的.
		

相应代码:第一种情况

import java.util.concurrent.locks.ReentrantLock;

public class MyRunnable1 implements Runnable {
	private int tk = 50;// 票数
	ReentrantLock r = new ReentrantLock();// 锁对象

	public void run() {
		while (true) {

			r.lock();// 上锁
			if (tk > 0) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + 
"正在卖第" + (tk--) + "张票!");
			}
			r.unlock();// 解锁

		}

	}

}
public class RunnableDemo {
	public static void main(String[] args) {
		// 一个对象中的三个线程,不会有问题
		// MyRunnable1 m = new MyRunnable1();
		// Thread t1 = new Thread(m, "窗口1");
		// Thread t2 = new Thread(m, "窗口2");
		// Thread t3 = new Thread(m, "窗口3");
		// t1.start();
		// t2.start();
		// t3.start();

		// 三个对象中的每个对象一个线程,会有问题
		// Thread t1 = new Thread(new MyRunnable1(), "窗口1");
		// Thread t2 = new Thread(new MyRunnable1(), "窗口2");
		// Thread t3 = new Thread(new MyRunnable1(), "窗口3");
		// t1.start();
		// t2.start();
		// t3.start();
	}
}

第二种情况:

import java.util.concurrent.locks.ReentrantLock;

public class MyThread extends Thread {
	private int tk = 50;
	ReentrantLock r = new ReentrantLock();

	public void run() {
		while (true) {

			r.lock();
			if (tk > 0) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + 
"正在卖第" + (tk--) + "张票!");
			}
			r.unlock();

		}

	}

}
public class MyThreadDemo {
	public static void main(String[] args) {

		// 一个对象三个线程? (做不到这种情况)
		// MyThread t = new MyThread();
		// t.start();

		// 三个对象,三个线程程 (会有问题)
		// MyThread t1 = new MyThread();
		// MyThread t2 = new MyThread();
		// MyThread t3 = new MyThread();
		// t1.setName("窗口1");
		// t2.setName("窗口2");
		// t3.setName("窗口3");
		// t1.start();
		// t2.start();
		// t3.start();

	}
}

 

© 著作权归作者所有

共有 人打赏支持
大强森
粉丝 2
博文 24
码字总数 9681
作品 0
奉贤
程序员
私信 提问
为什么单例模式需要double check

最近被多线程问题(multi-thread issue)弄昏了头。以前虽然也知道系统里要考虑多线程问题,也无数次见到double-check的代码,但是由于自己碰到这方面的问题基本上就是从其他地方拷贝一份现成...

zhangyujsj
2016/09/10
61
0
秒杀多线程第一篇 多线程笔试面试题汇总

系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性。系列中不但会详细讲解多线程同...

长平狐
2012/12/10
179
0
不止JDK7的HashMap,JDK8的ConcurrentHashMap也会造成CPU 100%

版权声明:本文为博主原创文章,未经博主朱小厮允许不得转载。 https://blog.csdn.net/u013256816/article/details/84917112 大家可能都听过JDK7中的HashMap在多线程环境下可能造成CPU 100%的...

朱小厮
2018/12/09
0
0
秒杀多线程第十一篇 读者写者问题

与上一篇《秒杀多线程第十篇 生产者消费者问题》的生产者消费者问题一样,读者写者也是一个非常著名的同步问题。读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但...

长平狐
2012/12/10
167
0
Java面试需要准备哪些多线程并发的技术要点

一、概念 什么是线程 一个线程要执行任务,必须得有线程 一个进程(程序)的所有任务都在线程中执行的 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务 多线程原理 同一...

码蚁说架构
2018/05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac java多版本控制

vim ~/.bash_profile ORACLE_JAVA_6_HOME="/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"ORACLE_JAVA_7_HOME="/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents......

晨猫
9分钟前
0
0
[转载]Qlist的用法

QList是一种表示链表的模板类。 QList是Qt的一种泛型容器类。它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作。 QList、QLinkedList和QVector提供的操作...

shzwork
9分钟前
0
0
谷歌的JavaScript编写风格中 13点值得我们注意的!

  对于那些还不熟悉JavaScript的编写风格的人,谷歌提供了编写JavaScript的编写风格指南,谷歌风格指南 其中列出了编写干净、可理解代码的最佳风格实践。   对于编写有效的JavaScript来说...

peakedness丶
24分钟前
1
0
Spring Boot2中配置HTTPS

1.生成证书 使用jdk,jre中的keytool.exe生成自签名的证书,需要配置JAVA_HOME和path环境变量,即jdk的环境变量。命令如下: keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA ...

voole
31分钟前
2
0
Spring Cloud Alibaba 新版本发布:众多期待内容整合打包加入!

在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也终于发布了最新的版本。该版本距离上一次发布,过去了整整4个月!下面就随我一起看看,这个大家期待已久的版本都有哪些内容值得我们关注。...

程序猿DD
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部