一起Talk Android吧(第二十三回:Java多线程编程一)
来源:互联网 发布:访问数据库的方式 编辑:程序博客网 时间:2024/05/16 17:49
各位看官们,大家好,上一回中咱们说的是Java常用类之文件操作的例子,这一回咱们说的例子是Java多线程编程。闲话休提, 言归正转。让我们一起Talk Android吧!
看官们,关于进程和线程的概念,我在C栗子中介绍过,如果哪位看官不清楚的话,可以查看C栗子中的内容。(进程概念点这里,线程概念点这里)在这里,我假定大家都明白进程和线程的概念,因此我们就来看看在Java中是如何实现多线程编程的。Java提供了Thread
类和Runnable
接口来实现多线程编程。我们只需要重写其中的run
方法,然后通过Thread
类的start
方法来启动线程就可以。下面是程序的伪代码,请大家参考:
class A extends Thread { //or implements Runnable{ public void run() { //do some thing }}new A().start(); // 启动线程
在上面的伪代码中,我们可以继承Thread
类或者实现Runnable
接口,这两者都可以达到多线程的效果。依据经验来看,使用Runnable
接口的时候比较多,因为它可以弥补继承时只能进行单继承的不足。使用这种方式实现多线程时,还需要把接口和Thread
类结合在一起,这样才能使用Thread
类中的start()
方法。那么如何才能把它们结合在一起呢?其实很简单,使用Thread
类的构造函数就可以。
不管是接口还是类,它们都有一个共同点:run()方法,也算是殊途同归吧。run()
方法是线程执行的主体,我们可以把相关的工作写到run()
方法中,线程启动后会自动调用该方法。千万不要主动去调用它,不然不会启动线程。
这时看官提问了:刚才介绍的内容好像只有一个线程,如何才能启动多个线程呢?只需要new A().start()
;就可以(这是伪代码中用来启动线程的代码),想启动几个线程就使用几次该代码。
看官们,光说不练不是我们的风格,接下来我们通过具体的代码演示Java多线程编程。
public class ThreadEx extends Thread { public static class TestThread implements Runnable{ private int data ; public void setData(int data) { this.data = data; } public int getData() { return data; } @Override public void run() { // TODO Auto-generated method stub for(int i=0; i<5; ++i){ setData(i+1); System.out.println(Thread.currentThread().getName()+ " Data :"+ getData()); } } } public static void main(String[] args) { TestThread threadItem = new TestThread(); Thread t1 = new Thread(threadItem); //connect the the class and interface by constructor Thread t2 = new Thread(threadItem); // create the second thread t1.start(); // start the first thread t2.start(); // start the second thread } }
看官们,上面的代码可以看作是对刚才伪代码的转换,相信大家结合代码中的注释就能明白代码的含义。代码中只有一处没有介绍过,它是Thread.currentThread().getName()
,通过该方法可以获取到当前线程的名字。
下面是程序的运行结果,请大家参考:
Thread-0 Data :1Thread-1 Data :1Thread-0 Data :2Thread-1 Data :2Thread-0 Data :3Thread-1 Data :3Thread-0 Data :4Thread-1 Data :4Thread-0 Data :5Thread-1 Data :5
看官们,该结果是一个比较理想的结果,从结果中可以看到,程序中的两个线程(Thread-0和Thread-1
)交替运行,而且两个线程都输出了相同的结果。请大家注意,这只是个参考,在不同的电脑上会有不同的结果,即使是在同一台电脑上不同时间也会有不同的结果。因此,如果哪位看官运行上面的代码后得到了和这里不同的结果,这是正常的。因为这是Java虚拟机在后台自动进行线程的调度,我们没有去干涉线程调度。
各位看官,关于Java多线程编程的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
- 一起Talk Android吧(第二十三回:Java多线程编程一)
- 一起Talk Android吧(第二十四回:Java多线程编程二)
- 一起Talk Android吧(第二十五回:Java多线程编程三)
- 一起talk C栗子吧(第二十三回:C语言实例--队列二)
- 一起Talk Android吧(第九回:Java中的封装:一)
- 一起Talk Android吧(第五回:Java中的程序结构)
- 一起Talk Android吧(第六回:Java中的函数)
- 一起Talk Android吧(第十四回:Java中的异常)
- 一起Talk Android吧(第二十七回:Java泛型)
- 一起Talk Android吧(第二十一回:Java常用类之文件操作一)
- 一起Talk Android吧(第二十九回:Android中的Activity一)
- 一起Talk Android吧(第三十六回:Android中的Fragment一)
- 一起Talk Android吧(第五十回:Android中的Fragment嵌套一)
- 一起Talk Android吧(第五十四回:Android中的Fragment显示与隐藏一)
- 一起Talk Android吧(第十一回:Java中的继承)
- 一起Talk Android吧(第三回:Java中的变量类型)
- 一起Talk Android吧(第四回:Java中的运算符)
- 一起Talk Android吧(第七回:Java综合小练习)
- 1.1.2获取和控制线程状态(Getting and Seeting Thread State)
- 操作符和交换a、b
- 五、Json
- etcd:从应用场景到实现原理的全方位解读
- JS斩杀LeetCode(2):Add Two Numbers
- 一起Talk Android吧(第二十三回:Java多线程编程一)
- grpc类型与struct的转换
- ltelliJ IDEA 创建Maven web项目无src目录的解决方案
- QT常用布局管理器总结
- jade模板之二,标签和属性
- 使用Hibernate连接MySQL
- 1024: 计算字母序号
- opencv3_java 在图形图像上画线LinesOnImage Imgproc.line
- MAC maven安装配置