使用继承自Thread类的子类:
同步块:
/**
* 继承Thread类的售票类
*
* @author XINY
*
*/
class TicketT extends Thread {
// 票数,起始数量为100
private static int tick = 100;
//随便写的一个对象,如没特殊要求可随便实例化一个对象,用于同步块中传入的值。
//为保证每个线程的锁一致,必需让obj为静态变量
static Object obj = new Object();
@Override
public void run() {
// TODO Auto-generated method stub
while (tick > 0) {
//obj对象无特殊要求,任何对象均可,但是必需保证每个线程传入的对象是同一个对象
synchronized (obj) {
if (tick > 0) {
try {
// 休眠10毫秒
sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 出票
System.out.println(Thread.currentThread().getName()
+ "----" + tick--);
}
}
}
}
}
/**
* 主类
*
* @author XINY
*
*/
public class TicketThread {
public static void main(String[] args) {
// 创建售票线程
TicketT t1 = new TicketT();
TicketT t2 = new TicketT();
TicketT t3 = new TicketT();
TicketT t4 = new TicketT();
// 开始线程
t1.start();
t2.start();
t3.start();
t4.start();
}
}
同步方法:
/**
* 继承Thread类的售票类
*
* @author XINY
*
*/
class TicketT extends Thread {
// 票数,起始数量为100
private static int tick = 100;
@Override
public void run() {
// TODO Auto-generated method stub
while (tick > 0) {
sale();
}
}
/**
* 同步方法
* 为保证锁相同,将sale方法定义为static
*/
public static synchronized void sale(){
if (tick>0) {
try {
// 休眠10毫秒
sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 出票
System.out.println(Thread.currentThread().getName()
+ "----" + tick--);
}
}
}
/**
* 主类
*
* @author XINY
*
*/
public class TicketThread {
public static void main(String[] args) {
// 创建售票线程
TicketT t1 = new TicketT();
TicketT t2 = new TicketT();
TicketT t3 = new TicketT();
TicketT t4 = new TicketT();
// 开始线程
t1.start();
t2.start();
t3.start();
t4.start();
}
}
使用实现Runnable接口的子类:
同步块:
/**
* 实现Runnable接口的类
*
* @author XINY
*
*/
class TicketR implements Runnable {
// 初始票数100
private int tick = 100;
Object obj=new Object();
@Override
public void run() {
// TODO Auto-generated method stub
while (tick > 0) {
//new Object() 是我随便写的,这里需要传入一个对象
synchronized (obj) {
if (tick > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 出票
System.out.println(Thread.currentThread().getName()
+ "----" + tick--);
}
}
}
}
}
/**
* 主类
*
* @author XINY
*
*/
public class TicketRunnable {
public static void main(String[] args) {
// TODO Auto-generated method stub
TicketR t = new TicketR();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
同步方法:
/**
* 实现Runnable接口的类
*
* @author XINY
*
*/
class TicketR implements Runnable {
// 初始票数100
private int tick = 100;
@Override
public void run() {
// TODO Auto-generated method stub
while (tick > 0) {
sale();
}
}
public synchronized void sale() {
if (tick > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 出票
System.out.println(Thread.currentThread().getName() + "----"
+ tick--);
}
}
}
/**
* 主类
*
* @author XINY
*
*/
public class TicketRunnable {
public static void main(String[] args) {
// TODO Auto-generated method stub
TicketR t = new TicketR();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}