【java并发】基础(1)--创建线程的两种方法
2017-04-10 20:54
489 查看
一、常用的两种方法
创建线程的两种方法:继承Thread类(java.lang.Thread)
实现Runnable接口(java.lang.Runnable)
1.1 继承Thread类
public class Thread1 extends Thread{ private int ticket = 10; @Override public void run() { while(this.ticket>0){ System.out.println(Thread.currentThread().getName()+":"+(ticket--)); } } }
public class TwoMethod { public static void main(String[] args) { //1.继承Thread类:启动三个线程,各卖10张票 Thread thread1 = new Thread1(); Thread thread2 = new Thread1(); Thread thread3 = new Thread1(); thread1.start(); thread2.start(); thread3.start(); } }
输出结果:Thread-0:10
Thread-2:10
Thread-1:10
Thread-2:9
Thread-0:9
Thread-2:8
Thread-1:9
Thread-2:7
Thread-0:8
Thread-2:6
Thread-2:5
Thread-2:4
Thread-2:3
Thread-2:2
Thread-2:1
Thread-1:8
Thread-0:7
Thread-1:7
Thread-0:6
Thread-0:5
Thread-0:4
Thread-0:3
Thread-1:6
Thread-0:2
Thread-1:5
Thread-0:1
Thread-1:4
Thread-1:3
Thread-1:2
Thread-1:1
1.2 实现Runnable接口
public class Thread2 implements Runnable { private int ticket = 10; @Override public void run() { while(this.ticket>0){ System.out.println(Thread.currentThread().getName()+":"+(ticket--)); } } }
public class TwoMethod { public static void main(String[] args) { //2.实现Runnable接口:启动3个线程(它们共用一个Runnable对象),这3个线程一共卖10张票! Thread2 thread = new Thread2();//Runnable对象,并非线程 Thread thread1 = new Thread(thread); Thread thread2 = new Thread(thread); Thread thread3 = new Thread(thread); thread1.start(); thread2.start(); thread3.start(); } }
输出结果:Thread-1:10
Thread-2:9
Thread-0:10
Thread-2:7
Thread-1:8
Thread-1:4
Thread-1:3
Thread-1:2
Thread-1:1
Thread-2:5
Thread-0:6
注1:这里的结果是某一次运行的结果,并不是每次都一样;
注2:可以看到本次输出结果并不是卖了10张票,而是11张。原因是票(ticket)是共享资源,原本一次只能由一个线程访问,但这里可能同时被多个线程访问。要解决这个问题要用到同步机制(如synchronized),这里主要讲线程的创建,就不赘述了,感兴趣的可以看这篇文章《Java多线程卖票例子》。
二、Runnable还是Thread?
通常建议使用实现Runnable接口的方式创建线程,原因如下:1.java支持单继承,但是可以实现多个接口。使用实现Runnable接口的方式具有更好的扩展性。
2.实现Runnable接口更利于”资源共享”。可以看到上面的例子中,多个线程都是基于同一个Runnable对象建立的,它们会共享Runnable对象上的资源。
三、start()与run()
start()和run()的区别:1.run():单独调用run()方法,就像调用普通的成员方法一样,在当前线程执行run(),并不会启动新线程。run()方法可以重复调用;
2.start():启动一个新线程,新线程会执行相应的run()方法。start()方法不能被重复调用(参见start()源码,非NEW状态的线程调用start()会抛异常)。
public class StartAndRun { public static void main(String[] args) { Thread thread = new MyThread(); //1.直接调用run()方法 thread.run(); //2.调用start()方法 thread.start(); // thread.start(); //不能重复调用,参见start()源码,非NEW状态的线程调用start()会抛异常 } } class MyThread extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName()); } }
输出结果:main
Thread-0
相关文章推荐
- Java基础,创建线程的两种方法
- java中创建线程的两种方法及其区别
- Java 创建线程的两种方法
- Java并发(基础知识)—— 创建、运行以及停止一个线程
- Java创建线程的两种方法
- Java中创建线程的两种方法
- JAVA中创建线程对象的两种方法:继承Thread和实现Runable
- Java创建线程的两种方法
- [Java并发编程]-创建线程的两种方式及区别
- Java 创建线程的两种方法
- java中创建线程的两种方法及其区别
- Java创建线程的常用的两种方法
- Java创建线程的两种方法
- 创建Java线程的两种方法
- java创建线程两种方法
- java学习日记(5)——创建线程的两种基本方法
- java线程的两种创建方法
- 0008 Java创建线程的两个方法【基础】
- (转)java创建线程的两种方法比较
- Java 创建线程的两种方法