本单元先整理java语言里线程的基本事项
何谓线程
单线程与多线程,thread 类 run 和start 方法
线程的启动
thread 类,runnable接口
线程的暂时停止
sleep方法
线程的共享互斥
synchronized方法,synchronized语句和锁定
线程的协调
wait set , wait方法 ,notify方法和notifyAll方法
有些线程在后台进行,
为了方便说明,前面只简单地介绍了 只有一个线程有操作,其实严格说来,有些线程在非java处理系统上,例如垃圾收集使用的
线程,GUI相关线程
由一个以上的线程构成的程序称为多线程程序,而java程序语言当初一开始就把多线程处理列入规格了
有不止一个线程在操作时,表示若要追踪各个线程的轨迹,就会派生出一团错综复杂的乱线团
GUI应用程序
几乎所有GUI应用程序都有一定有多线程,举例来说,假设现在有人用word编辑一个较大的文本文件
刚刚才做过单字查找的操作,当word进行查找进,屏幕上会出停止查找的按钮,用户随进均可停止查找
这个功能其实就用到了多线程
1,执行查找
2,显示按钮,若按下按钮,则停止查找
比较花费时间的i/o处理
一般来说,文件和网络的i/o处理比较花费时间,如果在这段时间中,程序无法进行其他处理,程序性能便会
大打折扣,遇到这种问题,有时也会使用多线程来解决,先执行i/o处理和非i/o处理线程分开,这样就能利用进行i/o时的时间中,同时进行其他处理
多个客户端
基本上,网络上的服务器必须同时处理1个以上的客户端,不过要是一事实上在服务器这边的程序设计加入一个以上客户端的概念的话,程序反而会变得更复杂。此时,不妨准备一个当客户端连接到服务器时,会自动出来迎接这个客户端的线程,这样一来,服务器的程序 就可以设计成好像只服务一个客户端,
1.4这个版本开始已经加入了新的i/o相关类库(NIO),有了这个类库,不必利用线程也能进行兼具性能和扩充性的i/o处理,
package Demo1;
public class test1 extends Thread {
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(i);
}
}
public static void main(String[] args) {
test1 m = new test1();
m.start();
//同一个Thread不能重复调用start方法
//java.lang.IllegalThreadStateException
//m.start();
}
}
线程的启动
并发与并行
并发跟并行的差别
当有一个以上的线程在操作时,若计算机只有一个中央处理器,根本不可能真正同时进行1个以上处理,输出字符
只有多处理器才可能出现并行执行
线程的启动
利用thread 类的子类的实例,启动线和
利用runable接口实现类的实例,启动线程
以下执行说明
线程的启动---利用thread类的子类----上面一种就是使用thread实现了多线程
先说明
使用runnable来实现多线程
package Demo1;
public class test2 implements Runnable {
@Override
public void run() {
for(int i=0;i<100;i++)
System.out.println(Thread.currentThread().getName()+i);
}
public static void main(String[] args) throws InterruptedException {
//使用进程加载相应的方法
new Thread(new test2()).start();
//Thread.sleep(1000);
for(int i=0;i<100;i++)
System.out.println(Thread.currentThread().getName()+i);
}
}
线程 的暂进停止 :
Thread.sleep(1000);
补充说明:该怎么唤醒呢,
如果是要半路唤醒,被Thread.sleep暂停的线程,则可利用interrupt方法
线程的共享互斥:
在多线程程序里,多个线程可自由操作,当然就可能同时操作到同一实例
这个情况有时会造成不必要的问题,假设现在是要帐户取钱,确认可用余额这部分程序 代码应为
java语言在处理线程共享互斥时,会使用关键字synchronized
synchronized方法
当一个方法加上关键字syncronized声明之后,就可以让一个线程操作这个方法,让一个线程操作并不是说只能让某一个特定的线程
操作而已,而是指一次只能让一个线程 执行,这种线程称为synchronized方法,又称为同步方法
在bank(银行类里) deposit存款,和withdraw取款
package Demo1;
public class Bank {
private int moneny;
private String name;
public Bank(String name,int money){
this.name=name;
this.moneny=money;
}
//存款
//当一个线程正在执行bank实例时deposit方法时,其他线程就不能执行同一实例
//deposit方法或withdraw方法,欲执行的线程必须排队等候
//bank类晨还有一个getname方法,它不是
public synchronized void deposit(int m){
moneny += m;
}
//取款
public synchronized boolean withdraw(int m){
if(moneny>=m){
moneny -= m;
return true;
}else{
return false;
}
}
public String getName(){
return name;
}
}
跟线程有关的其他话题:
以下跟线程有关的话题会在相关的章节继续说明:
取消线程处理中断
interrupt isInterrupted interrupted interuptedException
线程的优先级
setPriority getPriority
附录c
等侯线程结束
join
线程的状态移转
补充说明:wait,notify,notifyAll也是thread类的方法
wait notity 和notifyall三者确实不是thread 类固有的方法,不过因为object类是java所有类的祖先类
所以wait notify notfyAll也是Thread类的方法
wait
notify
notifyAll都是java.lang的object 类的方法,不是thread类固有的方法
请各位再回想一下wait notify notifyAll的作用
obj.wait是把现在的线程放到obj的wait set ;
obj.notify是从obj的wait set里唤醒一个线程
obj,notifyAll是唤醒所有在obj的wait set里的线程