java多线程技术(一)

时间:2022-03-01 17:29:25

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

这里我解释一下:我拿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 stub
System.out.println("" + Thread.currentThread().getName());
}

}

class Myrunnable implements Runnable {

public void run() {
// TODO Auto-generated method stub
System.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 stub
while (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 stub
while (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