java: Thread 和 runnable线程类
Java有2种实现线程的方法:Thread类,Runnable接口。(其实Thread本身就是Runnable的子类)
Thread类,默认有run(), start()方法,继承Thread类,需要实现run方法
Thread多线程,不能共享资源,保证数据的的统一(以商城商品数量,售票系统票的数量为例)
例如:
public class MyThread extends Thread {
	private String name; // 定义name属性
	public MyThread(String name) {
		this.name = name;
	}
	public void run() {// 覆写run()方法
		for (int i = 0; i < 50; i++) {// 表示循环10次
			System.out.println("Thread运行:" + name + ",i = " + i);
		}
	}
}
实现1:
此种方法说明:mt1线程执行完后,才能执行mt2线程
public class ThreadDemo01 {
	public static void main(String[] args) {
		MyThread mt1 = new MyThread("线程A") ;
		MyThread mt2 = new MyThread("线程B") ;
		mt1.run() ;	// 调用线程体
		mt2.run() ;	// 调用线程体
	}
}
实现2:
start()方法表示,调用系统底层方法,去抢占cpu资源,谁先抢到,谁就能优先得到cpu的调度
public class ThreadDemo02 {
	public static void main(String[] args) {
		MyThread mt1 = new MyThread("线程A");
		MyThread mt2 = new MyThread("线程B");
		mt1.start(); // 调用线程体
		mt2.start(); // 调用线程体
	}
}
Runnable:
public class MyThread implements Runnable { // 实现Runnable接口
	private String name; // 定义name属性
	public MyThread(String name) {
		this.name = name;
	}
	public void run() {// 覆写run()方法
		for (int i = 0; i < 50; i++) {// 表示循环10次
			System.out.println("Thread运行:" + name + ",i = " + i);
		}
	}
}
实现子类:
public class RunnableDemo01 {
	public static void main(String[] args) {
		MyThread mt1 = new MyThread("线程A");
		MyThread mt2 = new MyThread("线程B");
		new Thread(mt1).start(); // 调用线程体
		new Thread(mt2).start(); // 调用线程体
	}
}
推荐实现Runnable接口来使用多线程。
使用Runnable能实现资源共享,以商城/售票系统为例,售卖票
Thread例子:
public class MyThread extends Thread {// 继承Thread类
	private int ticket = 5; // 一共才5张票
	public void run() {// 覆写run()方法
		for (int i = 0; i < 50; i++) {// 表示循环10次
			if (this.ticket > 0) {
				System.out.println("卖票:ticket = " + this.ticket--);
			}
		}
	}
}
实现子类:
此种方法:其实票一共只有5张,但是三个线程,每个线程都能买到5张票,这样是不符合逻辑的
public class ThreadTicket {
	public static void main(String[] args) {
		MyThread mt1 = new MyThread(); // 一个线程
		MyThread mt2 = new MyThread(); // 一个线程
		MyThread mt3 = new MyThread(); // 一个线程
		mt1.start() ;	// 开始卖票
		mt2.start() ;	// 开始卖票
		mt3.start() ;	// 开始卖票
	}
}
实现方法二:
public class MyThread implements Runnable {// 实现Runnable接口
	private int ticket = 5; // 一共才5张票
	public void run() {// 覆写run()方法
		for (int i = 0; i < 50; i++) {// 表示循环10次
			if (this.ticket > 0) {
				System.out.println("卖票:ticket = " + this.ticket--);
			}
		}
	}
}
实现子类:
此方法,能实现线程内的资源共享,不会卖出多余的票
public static void main(String[] args) {
		MyThread mt = new MyThread(); // 一个对象
		new Thread(mt).start() ;// 一个线程开始卖票
		new Thread(mt).start() ;//一个线程
                new Thread(mt).start() ; // 一个线程开始卖票
 } 
}
原文:http://www.cnblogs.com/achengmu/p/6127463.html