黑马程序员技术交流社区
标题:
多线程,死锁的原理以及解决方法
[打印本页]
作者:
唯爱丶
时间:
2015-9-13 18:30
标题:
多线程,死锁的原理以及解决方法
请教大神指点!
作者:
奈何桥上升国旗
时间:
2015-9-13 18:30
//以电影院售票为例:
//SellTickets售票方法继承自Thread
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SellTickets extends Thread {
public static int tickets = 100 ;
// 创建锁对象
public static Lock lock = new ReentrantLock() ;
@Override
public void run() {
while(true){
// 加锁
lock.lock() ;
if(tickets > 0) {
try {
Thread.sleep(100) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "出售第" + (tickets--) + "张票");
}
// 释放锁
lock.unlock() ;
}
}
}
//测试类
public class ThreadTest {
public static void main(String[] args) {
// 创建线程对象
SellTickets t1 = new SellTickets() ;
SellTickets t2 = new SellTickets() ;
SellTickets t3 = new SellTickets() ;
// 给线程设置名称
t1.setName("窗口1") ;
t2.setName("窗口2") ;
t3.setName("窗口3") ;
// 启动线程
t1.start() ;
t2.start() ;
t3.start() ;
}
}
//Mythread类
public class MyThread extends Thread {
private Object objA = new Object();
private Object objB = new Object();
private boolean flag ;
public MyThread(boolean flag){
this.flag = flag ;
}
@Override
public void run() {
if(flag){
synchronized(objA){
System.out.println("true....objA......");
synchronized(objB){
System.out.println("true....objB.....");
}
}
}else {
synchronized(objB){
System.out.println("false....objB......");
synchronized(objA){
System.out.println("false....objA.....");
}
}
}
}
}
//测试类为:
public class ThreadTest2{
public static void main(String[] args) {
// 创建线程对象
MyThread t1 = new MyThread(true) ;
MyThread t2 = new MyThread(false) ;
// 启动线程
t1.start() ;
t2.start() ;
}
}
//a:创建MyCallable类并实现Callable接口
import java.util.concurrent.Callable;
public class MyCallable implements Callable {
@Override
public Object call() throws Exception {
for(int x = 0 ; x < 100 ; x++){
System.out.println(Thread.currentThread().getName() + "----" + x);
}
return null;
}
}
//b:创建测试类:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CallableTest {
public static void main(String[] args) {
// 创建对象
MyCallable callable = new MyCallable() ;
// 获取一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(2) ;
// 提交任务
executorService.submit(callable) ;
// 关闭线程池
executorService.shutdown() ;
}
}
// 我们如何使用匿名内部类的方式实现多线程?
public class MyThreadTest{
public static void main(String[] args) {
//两种方式: 使用Thread类
new Thread() {
@Override
public void run() {
for(int x = 0 ; x < 100 ; x++){
System.out.println(getName() + "---" + x);
}
}
}.start();
// 通过实现Runnable接口实现多线程
new Thread(new Runnable() {
@Override
public void run() {
for(int x = 0 ; x < 100 ; x++){
System.out.println(Thread.currentThread().getName() + "---" + x);
}
}
}).start() ;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2