您的位置:首页 > 编程语言 > Java开发

【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 线程 并发