一、什么是多线程技术?
线程也可以叫做轻量级进程。是一个程序执行流的最小单元。或许这么讲还不够好理解。打个比方:我们在电脑上登陆了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接口来开始一个新线程。