多线程
Posted www-jasmine-com
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。
一、join方法易错点
不要在自己的线程中开启另一个相同线程,会造成无限循环。
二、synchronized常犯的逻辑错误(下面为一个售票程序,注释部分为错误用法)
public class SellTicketDemo implements Runnable{
Object o = new Object();
private int ticket=50;
@Override
public void run() {
// synchronized (o) {
// while(true){
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// if(ticket>0){
// System.out.println(Thread.currentThread().getName()+"正在出售第"+ticket+"张票");
// ticket--;
// }
// }
//
// }错误,直到卖完了才释放监视器的锁
while(true){
synchronized (o) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"正在出售第"+ticket+"张票");
ticket--;
}
}
}
}
public static void main(String[] args) {
SellTicketDemo s = new SellTicketDemo();
new Thread(s, "1窗口").start();
new Thread(s, "2窗口").start();
new Thread(s, "3窗口").start();
Object o = new Object();
private int ticket=50;
@Override
public void run() {
// synchronized (o) {
// while(true){
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// if(ticket>0){
// System.out.println(Thread.currentThread().getName()+"正在出售第"+ticket+"张票");
// ticket--;
// }
// }
//
// }错误,直到卖完了才释放监视器的锁
while(true){
synchronized (o) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"正在出售第"+ticket+"张票");
ticket--;
}
}
}
}
public static void main(String[] args) {
SellTicketDemo s = new SellTicketDemo();
new Thread(s, "1窗口").start();
new Thread(s, "2窗口").start();
new Thread(s, "3窗口").start();
}
}
}
以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章