java创建线程的两种方法

来源:互联网 发布:腾讯微信大数据 编辑:程序博客网 时间:2024/05/17 08:33

第一种实现Runnable接口创建线程。

public class ProgApp {public static void main(String[] args) {Programe p = new Programe();Play p1 = new Play();Thread t = new Thread(p);Thread t1 = new Thread(p1);t.start();t1.start();}}

public class Play implements Runnable{@Overridepublic void run(){for(int i = 0; i < 10; i++){System.out.println("运动-->"+i);}}}

public class Programe implements Runnable{@Overridepublic void run(){for(int i = 0; i < 10; i++){System.out.println("敲helloworld-->"+i);}}}

第二种继承Thread类创建线程。

public class Rabbit extends Thread{@Overridepublic void run(){for(int i = 0; i < 10; i++){System.out.println("兔子跑了"+i+"步");}}}

public class Tortoise extends Thread{@Overridepublic void run(){for(int i = 0; i < 10; i++){System.out.println("乌龟跑了"+i+"步");}}}

public class Rabbit_Tortoise_APP {public static void main(String[] args) {Rabbit r = new Rabbit();Tortoise t = new Tortoise();r.start();t.start();}}

 但是我们一般比较常用用匿名类来实现这些功能。

匿名类实现Runnable接口创建线程。

public class NiMingClass {public static void main(String[] args) {Runnable q = new Runnable(){public void run(){for(int i=0;i<10;i++){System.out.println("qqqq--->"+i);}}};Runnable t = new Runnable(){public void run(){for(int i=0;i<10;i++){System.out.println("tttt--->"+i);}}};new Thread(q).start();new Thread(t).start();}}
匿名类继承Thread类创建线程。

public class NiMingClass1 {public static void main(String[] args) {new Thread(){public void run(){for(int i=0;i<10;i++){System.out.println("qqqqq--->"+i);}}}.start();new Thread(){public void run(){for(int i=0;i<10;i++){System.out.println("tttt-->"+i);}}}.start();}}

每创建一个Thread类的对象,就是创建了一个线程,其实主函数也是一个线程,所以你程序中的线程数总是比你自己创建的线程数多一个,即多了一个主函数线程。

如果为一个函数加上synchronized关键字后,就是只允许一个线程对这个函数进行访问,只有当它自己自动退出的时候才结束,否则就不会轮到别的线程去执行这个函数。

public void run() {System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);n--;System.out.println(n);}
运行结果(每一次结果可能不一样):

rrrr10
qqqq10
rrrr10
qqqq10
rrrr10
qqqq10
rrrr10
qqqq10
qqqq10
rrrr10
qqqq10
rrrr10
rrrr10
rrrr10
rrrr10
qqqq10
9
qqqq9
qqqq9
8


加上synchronized关键字后。

public synchronized void run() {System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);System.out.println(Thread.currentThread().getName()+n);n--;System.out.println(n);}
运行结果(运行多次结果完全一样):

rrrr10
rrrr10
rrrr10
rrrr10
rrrr10
rrrr10
rrrr10
rrrr10
rrrr10
9
qqqq9
qqqq9
qqqq9
qqqq9
qqqq9
qqqq9
qqqq9
qqqq9
qqqq9
8