java之多线程认识
多线程实现有两个类:
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()
阻塞状态:暂时停止执行 可能会把资源给其他使用
终止状态:线程执行完。不再使用