java总结篇--多线程
Java总结篇-多线程
1.大致的一些基本知识
今天在想多线程这部分知识该怎么总结呢?感觉没什么内容好写的,因为线程的方法并不多,常用的也就那几个,例如:
currentThread() 返回当前线程的引用(静态的方法)
getName() 得到线程名称
setName() 设置线程名称
getState() 得到当前线程的状态(线程的5中状态:新建,就绪,运行,阻塞,死亡)
SetPriority() 设置线程的优先级
还有就是线程调度的方法:
sleep() 睡眠(从运行进入到阻塞状态)
yield() 礼让(从运行进图入就绪状态)(实际使用的效果很差,基本上等于没用一样,建议使用sleep代替)
join() 插队(从就绪进入到运行状态)
常用的就这些了吧。
关于线程的安全问题:
1:多线程
2:同一数据源
3:修改数据
满足以上就有可能引发数据安全的问题,所以在多线程中尽量使用局部变量而少使用全局变量。另外 注意synchronized锁的添加虽然能够解决大多的数据安全问题却也使得代码的效率下降,但该用的 时候还是应该主动的去使用的。
2.例子
放出段关于多线程*生产者与消费者模型*的代码,这东西说的再多都不如一段代码来的直爽。
仓库类:
public class Store {
private int num ;
private int MAX = num ;
public Store(int num) {
super();
this.num = num;
MAX = num ;
}
public synchronized void createGoods(){
while(num==MAX){
try {
System.out.println("仓库满货了,生产者进入等待状态...");
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("生产者生产一件商品,当前为:"+(++num));
notify();
}
public synchronized void comsumerGoods(){
while(num==0){
System.out.println("仓库没货了,消费者进入等待状态...");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("消费者消费了一件商品,当前为:"+(--num));
notify();
}
}
生产者类:
public class Create_Thread implements Runnable{
Store store ;
public Create_Thread(Store store) {
super();
this.store = store;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
store.createGoods();
Thread.yield();//该处是为了让线程能更好的轮流抢到,但效果很一般啊。看后面的结果就知道了。
}
}
}
消费者类:
public class Cosumer_Thread implements Runnable{
Store store ;
public Cosumer_Thread(Store store) {
super();
this.store = store;
}
@Override
public void run() {
while(true){
store.comsumerGoods();
Thread.yield();
}
}
}
主函数类:
public class Thread_Main1 {
public static void main(String args[]){
Store store = new Store(10);
Thread th1 = new Thread(new Create_Thread(store));
th1.start();
Thread th2 = new Thread(new Cosumer_Thread(store));
th2.start();
System.out.println("***");
}
}
Store是一个仓库类,内部封装两个线程安全的两个方法,一个用于生产货物,一个消费者用于消费货物,
Create_Thread:顾名思义,生产者类,注意里面的while(),不然就生产一次线程就dead了。
Cosumer_Thread: 消费者类,
Thread_Main1:主类(测试类)
好咯,线程的总结就到这把,因为在java阶段对线程的使用太单一了,纯粹是为了创建个线程而创建,没有综合到其他的知识,也没有感觉到真的又需要才用它,但在Android阶段应该使用的会很频繁吧。像网络请求是不允许在主线程中出现的,这时候就要用到多线程了,并且需要用到接口回调的方法来实现线程之间的数据交流。明天看时间也打算写一篇模拟android实际应用中接口回调的文章。
(在这里想感谢一下我的一位舍友 -木鱼murre-,因为在我之前接触到接口回调的时候他为此写了篇关于接口回调的文章给我,感觉讲的很不错,想了解的可以进去看看:)