线程的实现

线程的实现

要实现多线程有两种方式,一种是继承thread类(要重写run()方法),一种是实现Runnable接口。

1、实现方式一 (用的较少)

package com.erequan.thread;

 

 

public class MyThread extends Thread {

private String name null;

 

public MyThread(String name) {

this.name name;

}

 

public void run()  //重写run方法

for (int 0; 50; i++) {

System.out.println("Thread运行:" name ", " i);

}

}

}

 

package com.erequan.thread;

 

public class TestThread {

 

 

public static void main(String[] args) {

MyThread thread1 new MyThread("线程A");

MyThread thread2 new MyThread("线程B");

 

// thread1.run(); //开始线程

// thread2.run(); //开始线程

thread1.start();  //开始线程

thread2.start();

}

 

}

 

 

 

2、实现方式二

public interface Runnable {

Void run();

}

 

package com.erequan.runnable;

 

 

public class MyRunnable implements Runnable {

 

private String name null;

 

public MyRunnable(String name) {

this.name name;

}

 

public void run()  //重写run方法

for (int 0; 50; i++) {

System.out.println("Thread运行:" name ", " i);

}

}

}

 

package com.erequan.runnable;

 

public class TestRuuable {

 

public static void main(String[] args) {

MyRunnable myRunnableA new MyRunnable("线程A");

MyRunnable myRunnableB new MyRunnable("线程B");

// Thread(ThreadGroup, Runnable, String)

new Thread(myRunnableA).start();  //启动线程

new Thread(myRunnableB).start();

}

}

 

两种实现方法的区别,在开发中一般都是用方法二。好处有:避免单继承的局限性。适用于多线程的共享。

 

如下假设一个购票系统:

thread方式实现:

 

package com.erequan.ticket;

 

public class BuyTiacet extends Thread {

int ticketNum 10;  //假设一共有10张票

 

public void run() {

for (int 0; 15; i++) {

if (ticketNum 0) {

System.out.println("买了" ticketNum "张票");

ticketNum--;

}

}

}

}

 

package com.erequan.ticket;

 

public class TestTicket {

 

 

public static void main(String[] args) {

//创建5个不同的线程

BuyTiacet buyTicketA new BuyTiacet();  //

BuyTiacet buyTicketB new BuyTiacet();

BuyTiacet buyTicketC new BuyTiacet();

BuyTiacet buyTicketD new BuyTiacet();

BuyTiacet buyTicketE new BuyTiacet();

BuyTiacet buyTicketF new BuyTiacet();

 

//开始线程

buyTicketA.start();

// buyTicketA.start();

// buyTicketA.start();

// buyTicketA.start();

// buyTicketA.start();

// buyTicketA.start();

buyTicketB.start();

buyTicketC.start();

buyTicketD.start();

buyTicketE.start();

buyTicketF.start();

}

}

 

结果是每个线程都买了相同多的票数,并不是资源的共享。即每个线程各不相关,各自有各自的线程。并且不能有相同的两个线程在执行,否则会报错!!

 

Runnable实现

 

package com.erequan.ticket;

 

public class RunnableTicket implements Runnable {

int ticketNum 4;  //假设一共有10张票

public void run() {

for (int 0; 50; i++) {

if (ticketNum 0) {

System.out.println("买了" ticketNum "张票");

ticketNum--;

}

}

}

}

 

 

 

package com.erequan.ticket;

 

public class TestTicket {

 

 

public static void main(String[] args) {

//Runnable方式

private static void RunnableTest() {

RunnableTicket runnableTicketA new RunnableTicket();

 

new Thread(runnableTicketA).start();  //线程 A

new Thread(runnableTicketA).start();  //线程 B

new Thread(runnableTicketA).start();  //线程 C

new Thread(runnableTicketA).start();  //线程 D

new Thread(runnableTicketA).start();  //线程 E

 

}

 

}

 

实现了资源的共享!!

 

但是在不同版本的jdk下得到的结果不同,可以查看帮助文档的run()方法!!

在线文档

http://online.chinaitpower.com/

 

Jdk1.5

public synchronized void start() {

if (started)

throw new IllegalThreadStateException();

started true;

group.add(this);

start0();

}

private native void start0();

 

public void run() {

if (target != null{

target.run();

}

 

Jdk1.4

Public  synchronized  native  void start();

 

Public  void  run() {

if(target != null{

target.run();

}

}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值