Java多线程学习笔记(一)

一、什么是多线程技术?

    线程也可以叫做轻量级进程。是一个程序执行流的最小单元。或许这么讲还不够好理解。打个比方:我们在电脑上登陆了QQ,那么QQ是一个进程单元。线程是什么呢?线程就是我们跟别人聊天、下载别人传送来的文件或者跟好友视频着。大家都知道,我们是可以用QQ一边跟好友视频、一边打字聊天、一边下载文件的,这就是多线程技术。这样我们就节省了很多等待的时间。这就是多线程技术的好处。

二、一个简单的多线程程序

    看下面的这个程序我们可以看到,类MyThread继承Thread,那么类MyThread也可以用Thread的方法,在这里我们用了start方法。

    Thread类中的start方法就是通知“线程规划器”,告诉它这个线程已经准备好了,等待调用线程对象的run()方法。

    两个线程并发执行,所以输出的结果的先后顺序是不一定的。结果如下:

    那么如果我们不使用Thread中的start方法,而是使用run方法呢?肯定还是调用run方法无疑,结果会是如何呢?​

    我们可以看到,这是顺序执行的,由run=main可以看到,实际上这还是一个线程main。

    这就能看出来调用start和调用run的区别在于:

    调用run就是像一般的调用类的方法那样,等它顺序执行完了才会执行下个方法。

    而调用start实际上是开始一个新线程,将此线程交给“线程规划器”来处理了。所以是两个线程并发执行。

三、共享数据的问题

    共享数据的情况就是多个线程访问同一个变量。这种情况会经常常见的,比如说投票机制,需要对同一个变量进行加一。

    但是共享数据的时候是会出现一些问题的。如下例:​

结果如下:​

要解决这个问题只需要在被调用的方法前加关键字:synchronized

这就给该段代码加锁了,被加锁的区域叫做临界区,一次只能有一个线程访问。

结果如下:​

看到这个结果可能有人会有问题,为什么不是按照ABCDE的顺序输出呢?

实际上执行start方法的顺序不代表线程启动的顺序。

四、实现Runnable接口

我们知道,java是单根继承的,所以如果一个类已经有了父类了就不能在继承Thread了,

这种情况下就需要使用Runnable接口来实现多线程。程序如下:

五、总结

    这篇博客写了一些简单的多线程程序,分析了多线程共享资源时可能出现的问题,然后讲了Runnable接口,当类已经有父类时可以使用Runnable接口来开始一个新线程。

发表评论

电子邮件地址不会被公开。 必填项已用*标注