截止JDK5.0为止,实现多线程一共有两种方法
①用继承extends Thread类的方式实现多线程
②用实现implement Runnable接口的方式实现多线程
一.同步代码块方式 1.1 同步代码块解决①的线程安全问题
public class ThreadSafeEx2 {
public static void main(String[] args) {
SoldOuts s1 = new SoldOuts();
SoldOuts s2 = new SoldOuts();
SoldOuts s3 = new SoldOuts();
s1.setName("售票口1:");
s2.setName("售票口2:");
s3.setName("售票口3:");
s1.start();
s2.start();
s3.start();
}
}
class SoldOuts extends Thread{
private static int tickets = 100;
@Override
public void run() {
while (true){
synchronized (SoldOuts.class) {//最方便的写法SoldOuts.class
if (tickets > 0) {
System.out.println(getName()+"票号为:" + (100 - (tickets - 1)));
tickets--;
} else {
break;
}
}
}
}
}
1.2 同步代码块解决②的线程安全问题
public class ThreadSafeEx1 {
public static void main(String[] args) {
sold s = new sold();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
Thread t3 = new Thread(s);
t1.setName("售票口1:");
t2.setName("售票口2:");
t3.setName("售票口3:");
t1.start();
t2.start();
t3.start();
}
}
class sold implements Runnable{
private int tickets = 100;
@Override
public void run() {
while (true){
//synchronized(this)最方便
synchronized(this) {//括号里加入同步监视器
//任何对象都可以充当同步监视器(锁)
//要求子类的多个线程必须用同一把锁
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+
"票号为" + (101 - tickets));
tickets--;
} else {
break;
}
}
}
}
}
二.同步方法方式
2.1 同步方法解决①的线程安全问题
public class ThreadSafeEx4 {
public static void main(String[] args) {
so1 s1 = new so1();
so1 s2 = new so1();
so1 s3 = new so1();
s1.setName("线程1:");
s2.setName("线程2:");
s3.setName("线程3:");
s1.start();
s2.start();
s3.start();
}
}
class so1 extends Thread{
private static int tickets =100;
@Override
public void run() {
while (tickets > 0){
SoldOut();
}
}
private static synchronized void SoldOut(){//锁默认为当前类.class
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "票号为:" + (100 - (tickets - 1)));
tickets--;
}
}
}
2.2 同步方法解决②的线程安全问题
public class ThreadSafeEx3 {
public static void main(String[] args) {
so s = new so();
Thread s1 = new Thread(s);
Thread s2 = new Thread(s);
Thread s3 = new Thread(s);
s1.setName("售票口1:");
s2.setName("售票口2:");
s3.setName("售票口3:");
s1.start();
s2.start();
s3.start();
}
}
class so implements Runnable{
private static int tickets = 100;
@Override
public void run() {
while (tickets > 0){
SoldOut();
}
}
private synchronized void SoldOut() {//同步监视器:this
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "票号为:" + (100 - (tickets - 1)));
tickets--;
}
}
}


