线程的实现

线程的实现

要实现多线程有两种方式,一种是继承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 i = 0; i < 50; i++) {

System.out.println("Thread运行:" + name + ", i = " + 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 i = 0; i < 50; i++) {

System.out.println("Thread运行:" + name + ", i = " + 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 i = 0; i < 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 i = 0; i < 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();

}

}

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/ubuntuvim/p/4796565.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值