一·【概念】
一般来说,我们把正在计算机中运行的程序叫做“进程”(process),而不将其称为“程序”(program)。
所谓“线程”(thread)。是“进程”中某个单一顺序的控制流。
新兴的操作系统。如WindowsNT、Windows95等,大多採用多线程的概念,把线程视为基本运行单位。
用最普通的话定义线程。即:一个程序(进程)里边不同的运行路径,即线程。
二·【问题】
·引入线程,给我们带来了什么优点?
三 ·【实例分析】
(1)引入线程,给我们带来了什么优点?我们对照于没有引用线程。会怎么样?
(a)引用线程代码:
/*引用线程*/ //主方法main() public class TestThread { public static void main(String args[]) { Runner r = new Runner(); //下边两行代码是体现多线程同步运行的一个过程。必须声明thread。Thread t = new Thread(r); t.start();//通过调用thread对象的start方式启动线程运行 for(int i=0;i<100;i++) { System.out.println("Main Thread:"+i); } } } //通过实现runnable接口实现多线程 class Runner implements Runnable { public void run() { for(int i=0;i<100;i++) { System.out.println("Runner"+i); } } }
(b) 不引用线程代码:
/*不引用线程*/ //主方法main() public class TestThread { public static void main(String args[]) { Runner r = new Runner(); //区别在这句话 r.run();//直接调用runner对象的run方法,不引用thread线程 for(int i=0;i<100;i++) { System.out.println("Main Thread:"+i); } } } //通过实现runnable接口实现多线程 class Runner implements Runnable { public void run() { for(int i=0;i<100;i++) { System.out.println("Runner"+i); } } }
对照运行结果:
<没有引入线程> <引用线程>
结果分析:
在没有引用线程时,它是顺着main函数运行。什么意思呢?就是说在main函数中。先把r.run()方法运行完毕后。在运行main函数剩下的部分;用一张图来描写叙述此过程:
而在引入线程时,它是这样运行的:r.run()和main函数中的输出两个是同步运行:什么意思呢?就是说r.run()方法的运行不影响main函数的顺序运行。用一张图来描写叙述此过程:
最后再用几句话总结该过程:
1·程序启动时会有一个由主方法(public static void main(){})所定义的线程。
2·通过实现Runnable接口的实例来实现多线程。
3·通过创建Thread实例来创建新的线程。
解释:在java中有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类仅仅要继承了Thread类同一时候腹泻了本类中的run()方法就能够实现多线程操作了,但因为在java中一个类仅仅能继承一个父类,所以,实际中多用实现Runnable接口来实现多线程。
4·每一个线程都是通过某个特定的thread对象相应的方法run()来完毕操作。
(方法run()成为线程体)
5·通过调用thread类的start()方法来启动一个线程。
【4·抛砖引玉】
以上实例仅仅是简单的解析引入线程同步给我们带来了什么方便之处?通过代码的实现,显然看出。其提高了cpu的处理速度。事实上这些问题我们在课本上都明确,但详细在代码中是怎么实现的?我们须要实践一番。包含下面几个问题,怎样用代码实现。我们应该怎么做呢?
1·当两个线程同一时候对一个资源操作,可能会给我们带来什么问题?
2·我们该怎么避免第2个问题呢?
3·假设使用锁的方式不当。会带来什么问题?