java多线程技术(一)

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

这里我解释一下:我拿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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值