每个java程序启动后,虚拟机将自动创建一个主线程。java中通过以下两种方式自定义线程:
(1)创建 java.lang.Thread 类的子类,重写该类的 run方 法
(2)创建 java.lang.Runnable接口的实现类,实现接口 中的 run 方法
下面用这两种方法实现3个线程依次打印ABC,并且循环10次。
(1)基于Thread 类的方法(该方法来自网络)
class FirstPrintThead extends Thread{
private AtomicInteger synObj;
private int flag;
private int count=0;
public FirstPrintThead(AtomicInteger synobj,int flag){
this.synObj=synobj;
this.flag=flag;
}
@Override
public void run() {
while(true){
synchronized (synObj) {
if(synObj.get()%3==flag){
synObj.set(synObj.get()+1);
count++;
System.out.println(Thread.currentThread().getName());
synObj.notifyAll();
if(count==10)
break;
}else{
try {
synObj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
测试代码:
public class PrintTest {
public static void main(String[] args) {
AtomicInteger synobj=new AtomicInteger(0);
Thread th1=new FirstPrintThead(synobj, 0);
th1.setName("A");
Thread th2 =new FirstPrintThead(synobj, 1);
th2.setName("B");
Thread th3 =new FirstPrintThead(synobj, 2);
th3.setName("C");
th1.start();
th2.start();
th3.start();
}
}
(2)Runnable
public class SecondPrintThread implements Runnable{
private AtomicInteger synObj=new AtomicInteger(0);
private static int PRINT_NUM=10;
private int count1=0;
private int count2=0;
private int count3=0;
@Override
public void run() {
print();
}
public void print(){
String name=Thread.currentThread().getName();
while(true){
synchronized (synObj) {
if(synObj.get()%3==0&&"A".equals(name)&&count1<PRINT_NUM){
count1++;
synObj.set(synObj.get()+1);
System.out.println(name);
synObj.notifyAll();
}else
if(synObj.get()%3==1&&"B".equals(name)&&count2<PRINT_NUM){
count2++;
synObj.set(synObj.get()+1);
System.out.println(name);
synObj.notifyAll();
}else
if(synObj.get()%3==2&&"C".equals(name)&&count3<PRINT_NUM){
count3++;
synObj.set(synObj.get()+1);
System.out.println(name);
synObj.notifyAll();
}else {
try {
synObj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(count1==10&&count2==10&&count3==10)
break;
}
}
}
}
测试代码:
public class PrintTest {
public static void main(String[] args) {
Runnable runnable=new SecondPrintThread();
Thread th1 =new Thread(runnable,"A");
Thread th2 =new Thread(runnable,"B");
Thread th3 =new Thread(runnable,"C");
th1.start();
th2.start();
th3.start();
}
}