线程与线程类
来源:互联网 发布:完美芦荟胶淘宝官网 编辑:程序博客网 时间:2024/05/01 06:57
ava多线程
java中有两种实现多线程的方式:
1. 一种是通过继承Thread类,同时重写start()方法。但是java中,只允许单继承,也就是一个类只能继承一个父类,使得该方式具有一定的局限性,等下就知道了。
2. 另一种是实现Runnable类接口的run()方法,再结合Thread类来实现多线程。
两种方式最终都是通过调用start()方法来实现多线程。切记不能直接调用Thread类或Runnable对象的run()方法,因为直接调用run()方法,只会执行同一个线程中的任务,而不会启动新线程。调用start()方法将会创建一个执行run()方法的线程。下面讲几个例子来辅助理解:
例1:继承Thread类,调用run()方法
//MyThread.java
public class MyThread extends Thread {
private String name;private int ticket = 5;public MyThread(String name) { this.name = name;}public void run() { for (int i=0; i<10; i++) { if (this.ticket>0) System.out.println("线程开始:"+this.name+",卖票:i="+this.ticket--); }}
}
//TestThreadRunnable.java:调用run()方法
public class TestThreadRunnable {
public static void main(String [] args) { Thread t1 = new MyThread("线程a"); Thread t2 = new MyThread("线程b"); **t1.run()**; **t2.run()**; /* Runnable r = new MyRunnable(); Thread t1 = new Thread(r, "线程a"); Thread t2 = new Thread(r, "线程b"); t1.start(); t2.start(); */}
}
运行结果:
线程开始:线程a,卖票:i=5
线程开始:线程a,卖票:i=4
线程开始:线程a,卖票:i=3
线程开始:线程a,卖票:i=2
线程开始:线程a,卖票:i=1
线程开始:线程b,卖票:i=5
线程开始:线程b,卖票:i=4
线程开始:线程b,卖票:i=3
线程开始:线程b,卖票:i=2
线程开始:线程b,卖票:i=1
结果分析:
看看运行结果,先执行第一个对象的run(),然后执行第二个对象的run(),并没有启动新线程。
例2:继承Thread类,调用start()方法
修改上面的TestThreadRunnable.java
//TestThreadRunnable.java:调用start()方法
public class TestThreadRunnable {
public static void main(String [] args) { Thread t1 = new MyThread("线程a"); Thread t2 = new MyThread("线程b"); t1.start(); t2.start(); /* Runnable r = new MyRunnable(); Thread t1 = new Thread(r, "线程a"); Thread t2 = new Thread(r, "线程b"); t1.**start()**; t2.**start()**; */}
}
运行结果:
线程开始:线程b,卖票:i=5
线程开始:线程a,卖票:i=5
线程开始:线程b,卖票:i=4
线程开始:线程b,卖票:i=3
线程开始:线程b,卖票:i=2
线程开始:线程b,卖票:i=1
线程开始:线程a,卖票:i=4
线程开始:线程a,卖票:i=3
线程开始:线程a,卖票:i=2
线程开始:线程a,卖票:i=1
结果分析:
1. 看看运行结果,两个线程正常完成交互运行。说明start()方法是新建了一个线程去执行run()方法。
2. 两个线程访问的run()方法都是独立的,对应的MyThread类成员变量ticket也是独立。资源不能共享。
例3:实现Runnable接口
//MyRunnable.java
public class MyRunnable implements Runnable {
private int ticket = 5;@Overridepublic void run() { // TODO Auto-generated method stub for (int i=0; i<10; i++) { if (this.ticket>0) System.out.println("线程开始:"+Thread.currentThread().getName()+",卖票:"+this.ticket--); }}
}
//TestThreadRunnable.java
public class TestThreadRunnable {
public static void main(String [] args) { /* Thread t1 = new MyThread("线程a"); Thread t2 = new MyThread("线程b"); t1.start(); t2.start(); */ Runnable r = new MyRunnable(); Thread t1 = new Thread(r, "线程a"); Thread t2 = new Thread(r, "线程b"); t1.start(); t2.start();}
}
运行结果:
线程开始:线程a,卖票:5
线程开始:线程b,卖票:4
线程开始:线程b,卖票:2
线程开始:线程a,卖票:3
线程开始:线程b,卖票:1
结果分析:
1. 使用Runnable对象时,Runnable定义的子类没有start()方法,只有Thread类中才有,观察Thread类,有一个构造方法public Thread(Runnable target),此构造方法接受Runanble的子类实例,也就是说可以通过Thread类来启动Runnable实现多线程。
2. 每个线程调用的都是同一个MyRunnable对象的run()方法,访问的是同一个对象中的变量ticket实例。
Runnable和Thread区别
实际开发中我们通常采用Runnable接口来实现多线程。因为实现Runnable接口比继承Thread类有如下好处:
1. 避免继承的局限,一个类可以继承多个接口,但是类只能继承一个类。
2. Runnable接口实现的线程便于资源共享。而通过Thread类实现,各自线程的资源是独立的,不方便共享。上面例2可以看出线程a跟线程b各卖了5张票,而例子3两个线程共卖了5张票,而且没有重复。
- 线程与线程类
- 多线程篇1 线程与线程类
- Thread Runable线程与线程类
- 线程与线程处理
- 线程与线程处理
- 线程与线程池
- 线程与线程属性
- 线程与线程句柄
- 操作系统:线程与线程
- 进程与线程线程
- 线程与线程池
- 线程与线程池
- 线程与线程生命周期
- 线程与线程池
- 【C#】线程与线程
- 进程与线程的区别,及用户界面线程和工作者线程的创建x线程类
- C#线程与线程池
- 用户界面线程与工作者线程
- ASP.Net MVC3安全升级导致程序集从3.0.0.0变为3.0.0.1
- vue.js加载页面出现闪烁问题的解决
- 运维角度浅谈MySQL数据库优化
- Android JNI中C和JAVA代码之间的互相调用
- 一张图看完语法知识
- 线程与线程类
- GPS工作原理
- JAVA相关基础知识
- [整理]PHP/HTML混写的四种方式
- 1040. 有几个PAT(25)----暴力
- Python之动态检测编码chardet
- 23.Merge k Sorted Lists
- AndroidStudio动态调试apk
- SSM/angularjs _ 文件的上传下载