线程的实现
要实现多线程有两种方式,一种是继承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();
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。