java 多线程

来源:互联网 发布:网络翻墙工具app 编辑:程序博客网 时间:2024/06/15 08:21

每个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;   }@Overridepublic 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 blocke.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;@Overridepublic 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();}elseif(synObj.get()%3==1&&"B".equals(name)&&count2<PRINT_NUM){count2++;synObj.set(synObj.get()+1);System.out.println(name);synObj.notifyAll();}elseif(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();}}



0 0
原创粉丝点击