多线程实现有两个类:
Thread类 多线程操作类 继承Thread类 覆写run方法
class 类名称 extend Thread{
属性
方法
public void run(){
线程主体
}
结果
其实可以看出Runnable 后面还是实例化了 Thread对象了 调用了start方法
Thread类 多线程操作类 继承Thread类 覆写run方法
class 类名称 extend Thread{
属性
方法
public void run(){
线程主体
}
}
测试代码
package ThreadTest;
class MyThread extends Thread{
private String name;
public MyThread(String name) {
super();
this.name = name;
}
public void run() {//覆写run 方法 作为线程 的操作主体
for (int i = 0; i < 10; i++) {
System.out.println(name+"运行,i="+i);
}
}
}
public class test1 {
public static void main(String[] args) {
MyThread mt1=new MyThread("线程A");
MyThread mt2=new MyThread("线程B");
mt1.run();
mt2.run();
}
}
结果
可以看出来 并没有并发 这是最古老的写法,如果改成 start方法 结果就会并发 谁抢 就会先运行
(2)实现 runnable接口
我们也可以从实现接口的形式 实现多线程 Runnable 只定义了一个抽象方法
public void run();
class 类名称 implement Runnable{
属性....;
方法.....;
public void run(){ //覆写run方法
线程主体
}
}
测试代码
package ThreadTest;
class MyThread implements Runnable{
private String name;
public MyThread(String name) {
this.name = name;
}
public void run() {//覆写run 方法 作为线程 的操作主体
for (int i = 0; i < 10; i++) {
System.out.println(name+"运行,i="+i);
}
}
}
public class test1 {
public static void main(String[] args) {
MyThread mt1=new MyThread("线程A");
MyThread mt2=new MyThread("线程B");
Thread tq=new Thread(mt1);//实例化Thread对象
Thread tw=new Thread(mt2);
tq.start();
tw.start();
}
}
其实可以看出Runnable 后面还是实例化了 Thread对象了 调用了start方法
结果
已经实现了并发
3.Thread类与Runnable接口的联系
因为这个联系 最好是用一个卖票系统来演示
Thread 和Runnable的区别 就是共享资源
先看thread
package ThreadTest;
class MyThread implements Runnable{
private int ticket=5;
public void run() {
for (int i = 0; i < 100; i++) {
if (this.ticket>0) {
System.out.println("卖票:ticket"+ticket--);
}
}
}
}
public class test1 {
public static void main(String[] args) {
MyThread mt1=new MyThread();//实例化对象
MyThread mt2=new MyThread();
MyThread mt3=new MyThread();
mt1.run();//调用线程主体
mt2.run();
mt3.run();
}
}
总共15张票
如果用Runnable 就会卖出5张票
package ThreadTest;
class MyThread implements Runnable{
private int ticket=5;
public void run() {
for (int i = 0; i < 100; i++) {
if (this.ticket>0) {
System.out.println("卖票:ticket"+ticket--);
}
}
}
}
public class test1 {
public static void main(String[] args) {
/* MyThread mt1=new MyThread();//实例化对象
MyThread mt2=new MyThread();
MyThread mt3=new MyThread();
mt1.run();//调用线程主体
mt2.run();
mt3.run();
对比一下
*/
MyThread mt=new MyThread();//实例化对象
//调用了三条线称
new Thread(mt).run();
new Thread(mt).run();
new Thread(mt).run();
}
}
Thread类与Runnable接口
实现Runnable接口的明显有点
适合多个相同程序代码的线程去处理同一个资源
可以便面由于单继承局限所带来的影响
增强了程序的健壮性 代码能被多个线程共享 代码与数据是独立的
模板代码
创建状态:准备好了一个多线程对象 Thread t=new Thread();
就绪状态 调用start()方法 等待cpu的调度
运行状态:执行run()
阻塞状态:暂时停止执行 可能会把资源给其他使用
终止状态:线程执行完。不再使用