java多线程编程注意问题
2014-06-17 11:37
375 查看
java多线程编程注意问题
多线程的概念问度娘 ,大部分是千篇一律的。对于编程经验不是很丰富的程序员是比较难消化的。
作者从实际应用的角度来分析java多线程编程应注意的问题。
应用场景假设:
一个影院有三个售票口,
分别用于向儿童、成人和老人售票。影院为每个窗口放有100张电影票,
分别是儿童票、成人票和老人票。(一个售票员相当于一个CPU,电影院最多可提供3名售票员).
问题:怎样使电影院售票速度最快。(很多人在排队等待买票)。
那么可想而知,我们是开3个售票窗口,让3名售票员都动起来。这就是多线程。
在java平台多线程编程的程序员都知道,线程编程有2种实现办法继承Thread 和实现Runnable接口。
我们先来看用继承的办法实现。
public class MutliThread extends Thread{
private int ticket=100;//每个线程都拥有100张票
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
测试类
public class MutliThreadDemo {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
m1.start();
m2.start();
m3.start();
}
}
问题2 。如果影院的票总计是100张,3名售票员同事售票。上述继承的办法是否能满足要求。
经过分析明显不能满足,因为无法实现多线程资源共享。这个时候我们就需要采用实现Runnable接口的办法。
public class MutliThread implements Runnable{
private int ticket=100;//每个线程都拥有100张票
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
测试类:
public class MutliThreadDemo {
public static void main(String [] args){
MutliThread m=new MutliThread();
Thread t1=new Thread(m,"Window "+i);
Thread t2=new Thread(m,"Window "+i);
Thread t3=new Thread(m,"Window "+i);
t1.start();
t2.start();
t3.start();
}
}
对于第2中多线程,我们的线程是不是安全,是执行了100次?答案是肯定的。
作者将打印的语句进行了比对。确实是100次。
如果将变量换成静态的,就是大于100次。是不满足我们的业务需求。
其实写个多线程类并不难,难的是要分析我们的线程是不是安全的。这个安全就是满足我们的业务需求。
那在多线程编程的时候,我们要注意什么问题了。
总结:
1.多线程共享资源,执行同一任务,需要Runnable接口。
2 静态方法通常是安全的。静态成员变量是不安全的。
3.如何解决我们的安全问题,通常的做法是锁机制,或者用普通成员变量。
4.举例:HashMap 与 currentHashMap . 区别: hashmap 比currenthashmap执行效率要高。但线程不安全。 而currenthashmap线程是安全的。
多线程的概念问度娘 ,大部分是千篇一律的。对于编程经验不是很丰富的程序员是比较难消化的。
作者从实际应用的角度来分析java多线程编程应注意的问题。
应用场景假设:
一个影院有三个售票口,
分别用于向儿童、成人和老人售票。影院为每个窗口放有100张电影票,
分别是儿童票、成人票和老人票。(一个售票员相当于一个CPU,电影院最多可提供3名售票员).
问题:怎样使电影院售票速度最快。(很多人在排队等待买票)。
那么可想而知,我们是开3个售票窗口,让3名售票员都动起来。这就是多线程。
在java平台多线程编程的程序员都知道,线程编程有2种实现办法继承Thread 和实现Runnable接口。
我们先来看用继承的办法实现。
public class MutliThread extends Thread{
private int ticket=100;//每个线程都拥有100张票
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
测试类
public class MutliThreadDemo {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
m1.start();
m2.start();
m3.start();
}
}
问题2 。如果影院的票总计是100张,3名售票员同事售票。上述继承的办法是否能满足要求。
经过分析明显不能满足,因为无法实现多线程资源共享。这个时候我们就需要采用实现Runnable接口的办法。
public class MutliThread implements Runnable{
private int ticket=100;//每个线程都拥有100张票
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
测试类:
public class MutliThreadDemo {
public static void main(String [] args){
MutliThread m=new MutliThread();
Thread t1=new Thread(m,"Window "+i);
Thread t2=new Thread(m,"Window "+i);
Thread t3=new Thread(m,"Window "+i);
t1.start();
t2.start();
t3.start();
}
}
对于第2中多线程,我们的线程是不是安全,是执行了100次?答案是肯定的。
作者将打印的语句进行了比对。确实是100次。
如果将变量换成静态的,就是大于100次。是不满足我们的业务需求。
其实写个多线程类并不难,难的是要分析我们的线程是不是安全的。这个安全就是满足我们的业务需求。
那在多线程编程的时候,我们要注意什么问题了。
总结:
1.多线程共享资源,执行同一任务,需要Runnable接口。
2 静态方法通常是安全的。静态成员变量是不安全的。
3.如何解决我们的安全问题,通常的做法是锁机制,或者用普通成员变量。
4.举例:HashMap 与 currentHashMap . 区别: hashmap 比currenthashmap执行效率要高。但线程不安全。 而currenthashmap线程是安全的。
相关文章推荐
- java高级多线程编程--关于线程的停止问题
- Java多线程编程——关于notify(), wait()的问题
- 关于java 多线程编程的同步问题
- java的并发编程需要注意的问题
- java高级多线程编程--关于线程的停止问题
- Java多线程编程— 线程同步问题
- Java的编程应该注意的问题
- Java 多线程编程常见问题
- java高级多线程编程--关于线程的停止问题
- 多线程编程中注意的问题
- Java调用RXTX库与Arduino进行串口通讯需注意的编程问题
- Java并发编程的艺术(一)——并发编程需要注意的问题
- java高级多线程编程--关于线程的停止问题
- 编写多线程的Java应用程序-如何避免当前编程中最常见的问题
- java多线程编程之安全性问题
- 编写多线程的 Java 应用程序 如何避免当前编程中最常见的问题
- 多线程编程需要注意的问题
- Java并发编程的艺术(一)——并发编程需要注意的问题
- java-面试- Java并发编程(一)——并发编程需要注意的问题
- java的synchronized关键字,多线程编程的注意事项