java: Thread 和 runnable线程类

Posted 穆晟铭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java: Thread 和 runnable线程类相关的知识,希望对你有一定的参考价值。

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() ; // 一个线程开始卖票
}
}

  

 

 



以上是关于java: Thread 和 runnable线程类的主要内容,如果未能解决你的问题,请参考以下文章

Java - Thread 和 Runnable实现多线程

Thread 和 Runnable

Java并发编程:Runnable和Thread实现多线程的区别(含代码)

Java 多线程之 Thread 类 和 Runnable 接口初步使用

Java多线程extends Thread和implements Runnable

Java多线程系列--“基础篇” 线程创建的方式