多线程详解,同步,死锁,等待-通知
来源:互联网 发布:墙面网络面板用a还是b 编辑:程序博客网 时间:2024/06/06 02:44
1.多线程的两种实现--class A extends Thread,class B implements Runnable---对应的两种启动方法分别是A a = new A();a.start();---B b = new B();new Tread(b).start();
两种方法都要实现public void run() {};
2.几个函数,
long
getId()
返回该线程的标识符。
String
getName()
返回该线程的名称。
int
getPriority()
返回线程的优先级。
3.线程安全
使用关键字synchronized,有两种同步形式分别是同步方法也同步块。
4.线程死锁,
代码示例:
class MultiThread {
public static void main(String[] args) {
SellThread st = new SellThread();
new Thread(st).start();
try {
Thread.sleep(1);
}
catch(Exception e) {
e.printStackTrace();
}
st.b = true;
new Thread(st).start();
//new Thread(st).start();
//new Thread(st).start();
}
}
class SellThread implements Runnable {
int tickets = 100;
boolean b = false;
Object obj = new Object();
public void run() {
if(b == false) {
while(true) {
sell();
}
}
while(true) {
synchronized(obj) {//obj----this
try {
Thread.sleep(10);
}
catch(Exception e) {
e.printStackTrace();
}
synchronized(this) {
if(tickets>0) {
System.out.println("obj" + Thread.currentThread().getName() + "sell tickets:" + tickets);
tickets--;
}
}
}
sell();
}
}
public synchronized void sell() {
if(tickets>0) {
synchronized(obj) {
try {
Thread.sleep(10);
}
catch(Exception e) {
e.printStackTrace();
}
System.out.println("this" + Thread.currentThread().getName() + "sell tickets:" + tickets);
tickets--;
}
}
}
}
上面两个线程互相等待各自的锁所以会出现死锁现象
5.wait() 与 notify();
代码示例:
class Test {
public static void main(String[] args) {
Queue q = new Queue();
Producer p = new Producer(q);
Consumer c = new Consumer(q);
p.start();
c.start();
}
}
class Producer extends Thread {
Queue q;
Producer(Queue q) {
this.q = q;
}
public void run() {
for(int i=0;i<10;i++) {
q.put(i);
System.out.println("Producer put" + i);
}
}
}
class Consumer extends Thread {
Queue q;
Consumer(Queue q) {
this.q = q;
}
public void run() {
while(true) {
System.out.println("Consumer:" + q.get());
}
}
}
class Queue {
int value;
boolean b = false;
public synchronized void put(int i) {
if(b == false) {
value = i;
b = true;
notify();
}
try{
wait();
}
catch(Exception e) {
e.printStackTrace();
}
}
public synchronized int get() {
if(b == false) {
try {
wait();
}
catch(Exception e) {
e.printStackTrace();
}
}
b = false;
notify();
return value;
}
}
- 多线程详解,同步,死锁,等待-通知
- 避免通知等待中死锁
- 多线程 等待/通知机制
- java多线程同步死锁
- 多线程同步死锁问题
- 多线程之同步死锁
- 多线程 同步与死锁
- 多线程的等待/通知机制
- 多线程之等待通知机制
- Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期
- 黑马程序员——Java基础——多线程的同步、死锁和等待唤醒机制
- 同步synchronized 无限期等待导致死锁
- linux多线程创建、等待、同步
- java线程同步的等待通知机制
- Java多线程同步死锁例程
- Java 多线程同步与死锁
- 多线程之同步与死锁
- 多线程之同步和死锁
- psexec 远程控制Windows XP的设置方法
- 拥抱变化—— 可扩展性杂谈
- sourcegrid 应用实例(全部来自官网下载的例子)——Use of Controllers: Cursor, Click event, ContextMenu and ToolTip
- HDU 2009 求数列的和
- 转:我的嵌入式学习之路
- 多线程详解,同步,死锁,等待-通知
- [JavaScript] 整数金额转汉语数字大写
- sourcegrid 应用实例(全部来自官网下载的例子)——Editable headers
- sql锁机制
- 几种函数调用方法(关键字)
- 筛素数-2909
- [求助]有什么好的数据比对算法呢,请高手解答
- sourcegrid 应用实例(全部来自官网下载的例子)——Multiple columns sort
- asp.net中ListView的一个Bug