java多线程技术(一)

来源:互联网 发布:ooa ood oop编程思想 编辑:程序博客网 时间:2024/05/18 13:47

多线程技术的优点就是提高系统的运行效率

这里我解释一下:我拿QQ作例子,QQ里有很多功能,例如:发送信息、视频通话、截图等等,假如QQ是单任务执行,也就是说我们在使用发送信息这个功能的时候不能使用视频通话、截图等等的功能,只能在发送信息完成后我们才能使用其他功能,那我估计没人会使用QQ这款软件。这时候就需要多线程技术,使得我们能在同一时刻使用多个功能。

java的多线程有两种形式:

一、继承Thread类

二、实现Runnable接口

package Java_test;public class Test {public static void main(String[] args) {Mythread mt = new Mythread();mt.setName("mt");mt.start();Myrunnable mr = new Myrunnable();Thread thread = new Thread(mr);thread.setName("thread");thread.start();}}class Mythread extends Thread {public void run() {// TODO Auto-generated method stubSystem.out.println("" + Thread.currentThread().getName());}}class Myrunnable implements Runnable {public void run() {// TODO Auto-generated method stubSystem.out.println("" + Thread.currentThread().getName());}}


注意:多线程是异步的,线程被调用的时机是随机的。

这里我得补充一下,java进程里至少存在一个main线程,而这个线程就是调用main()方法的,他是由JVM创建的。

使用Thread与Runnable的区别:

在大多数情况下我们都选择使用Runnable,因为使用Thread有局限性,我举个很经典的例子:卖票

package Java_test;public class Test {public static void main(String[] args) {Mythread mt0 = new Mythread();mt0.setName("mt0");Mythread mt1 = new Mythread();mt1.setName("mt1");Mythread mt2 = new Mythread();mt2.setName("mt2");mt0.start();mt1.start();mt2.start();}}<pre name="code" class="java">class Mythread extends Thread {int count = 5;public void run() {// TODO Auto-generated method stubwhile (count > 0) {count--;System.out.println(Thread.currentThread().getName() + " 卖了一张票,还有 "+ count + " 张票");}}}

运行结果:mt2 卖了一张票,还有 4 张票mt1 卖了一张票,还有 4 张票mt2 卖了一张票,还有 3 张票mt0 卖了一张票,还有 4 张票mt2 卖了一张票,还有 2 张票mt2 卖了一张票,还有 1 张票mt1 卖了一张票,还有 3 张票mt0 卖了一张票,还有 3 张票mt1 卖了一张票,还有 2 张票mt0 卖了一张票,还有 2 张票mt1 卖了一张票,还有 1 张票mt0 卖了一张票,还有 1 张票

从运行结果可以看出,每个Thread对象都是操作的是不同的count,没有实现共享数据。

我们再看个例子

package Java_test;public class Test {public static void main(String[] args) {Myrunnable mr = new Myrunnable();Thread mt0 = new Thread(mr);mt0.setName("mt0");Thread mt1 = new Thread(mr);mt1.setName("mt1");Thread mt2 = new Thread(mr);mt2.setName("mt2");mt0.start();mt1.start();mt2.start();}}class Myrunnable implements Runnable {int count = 5;synchronized public void run() {// TODO Auto-generated method stubwhile (count > 0) {count--;System.out.println(Thread.currentThread().getName() + " 卖了一张票,还有 "+ count + " 张票");}}}


运行结果:mt0 卖了一张票,还有 4 张票mt0 卖了一张票,还有 3 张票mt0 卖了一张票,还有 2 张票mt0 卖了一张票,还有 1 张票mt0 卖了一张票,还有 0 张票


从上面我们可以看到,多个线程操作同一个数据,实现了数据共享,这样 卖票 才符合现实。

这里我们涉及一个关键词synchronized

synchronized:

这是一个上锁的概念,可以给对象或者方法上锁,目的是线程安全。

synchronized修饰的对象或者方法,在多个线程调用的时候发挥重要作用,例如:

当一个线程a调用某方法的时候,就会给这个方法上锁,其他的线程b调用的时候,就不能调用,这线程b会持续尝试调用其方法,直到可以调用,当线程a调用其方法完成后,才会解锁其方法使得其他的线程可以调用。


下篇文章:java多线程技术(二)

http://blog.csdn.net/x_i_a_o_hei/article/details/52249692




0 0