多线程技术的优点就是提高系统的运行效率
这里我解释一下:我拿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