JAVA 多线程 笔记

来源:互联网 发布:青蜂网络 编辑:程序博客网 时间:2024/05/19 12:17
Thread是JAVA中的一个类
java.lang.Thread(java.lang.*是java默认自带包,不用import)

①创建并启动一个新的线程
Runnable threadJob = new MyRunnable();
//创建Runnable 对象(线程的任务) 

Thread myThread = new Thread(threadJob);
//Thread(Runnable 任务)--->Thread 构造函数

myThread.start();
//要启动线程,要不不会为线程分配独立的空间,实际上每个线程都有自己独立的运行空间,栈

对于线程的任务,要事先定义一个类,实现Runnable 接口
Runnable接口只有一个方法要实现,public void run();

JAVA  多线程 笔记 - 小镜子~ - 菜园子
 

②线程调度
视不同的JAVA虚拟机,不同的计算机,不同的时刻,有可能展现不同的调度结果(线程运行的次序和结束的次序可能不一样)
原因是,多线程时,让线程宏观上并行运行(但是单处理器计算机微观上来讲只有一个线程占据CPU),线程被轮流调用运行,相当于PC指针在线程之间疯狂的不停移动= =

③Thread.sleep()
Thread.sleep(2000);
//让线程停止工作,睡2000ms,即2 秒
//有可能抛出异常 InterruptedException

④临界区问题
比如两个线程同时对money变量有更改,由于线程是并行的,可能导致更新的失效
例线程A和线程B
线程A :   int a=money;
money=a+1;

线程B:   int a=money;
money=a+1;

线程A运行完 第一句 int a=money 被调度器敲晕了,线程B开始做任务,完成了两步,实现了money增1。
此刻线程A被唤醒,但是并不知道B已经对money做了更新,a保存的扔是B昨晚之前的money值。A做完后,money值仍只增加了1。

这就产生了错误

解决方案:synchronized修饰符
synchronized代表,被它修饰的代码段,要么全做,要么全不做,保证了功能的原子性(atomic 不可分割)
用法:
1. public synchronized void increment(){
int a=money;
money=a+1;
}


2. public void increment(){
doStuff();
synchronized(this){
int a=money;
money=a+1;
}
}
//局部的 
//this用以指示当前对象

⑤死锁
死锁指两个或两个以上的线程互相持有资源而陷入永久的等待。
JAVA没有处理死锁的机制,所以设计程序要小心

⑥线程重命名
Thread a = new Thread(new MyRunnable());
a.setName("XiaoJing");
//多半用于测试

一个超级简易聊天客户端服务端测试小程序:
原创粉丝点击