多线程
//一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例(不推荐)
//另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。(推荐)
//使用方法二创建一个测试类
public class MyThread2 implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i!=100;i++)
{
Thread t = Thread.currentThread();
System.out.println(t.getName() + ":" + i);
}
}
}
//多线程
private static void method2() {
MyThread2 m = new MyThread2();
Thread t = new Thread(m);
t.setName("Hei");
t.start();
Thread t2 = new Thread(m);
t2.setName("Hello");
t2.start();
}
多线程出现的问题
现象
//static void sleep(long millis):让当前线程停一会
public class Ticket implements Runnable{
int ticket;
public Ticket(int ticket)
{
this.ticket = ticket;
}
public void run() {
// TODO Auto-generated method stub
Thread t = Thread.currentThread();
while(true)
{
if(ticket>0)
{
System.out.println(t.getName() + ":" + ticket);
ticket--;
}
else
break;
}
}
}
private static void method3() {
Ticket tk = new Ticket(100);
Thread t1 = new Thread(tk);
Thread t2 = new Thread(tk);
Thread t3 = new Thread(tk);
t1.setName("售票口1");
t2.setName("售票口2");
t3.setName("售票口3");
t1.start();
t2.start();
t3.start();
}
解决方法(增加mutex互斥锁)
public class Ticket implements Runnable{
int ticket = 100;
Object mutex = new Object();
@Override
public void run() { // 注意
// TODO Auto-generated method stub
Thread t = Thread.currentThread();
while(true)
{
synchronized(mutex) //注意
{
if(ticket>0)
{
System.out.println(t.getName() + ":" + ticket);
ticket--;
}
else
break;
}
}
}
}
//或者(锁的位置不同)
public class Ticket implements Runnable{
int ticket = 100;
Object mutex = new Object();
@Override
public synchronized void run() { // 注意
// TODO Auto-generated method stub
Thread t = Thread.currentThread();
while(true)
{
if(ticket>0)
{
System.out.println(t.getName() + ":" + ticket);
ticket--;
}
else
break;
}
}
}