进程:操作系统上并发运行的一个程序。
并发:由cpu分配时间片执行 微观串行,宏观并行
线程:进程中并发的一个任务
线程的组成
1.cpu
2.数据 堆空间共享 栈空间独立
3.代码
创建线程的方式
1.实现Runnable接口,创建Runnable类型的对象。将其提交给Thread对象
class Thread01 implements Runnable{
public void run(){
for(int i=;i< 1000:i++){
System.out.println("aaa"+i);
}
}
}
Runnable r = new Thread01();
Thread01 t = new Thread01(r);
t.start();
2.继承Thread 类,重写run方法
class Thread02 extends Thread{
public void run(){
for(int i = 10;i<1000;i++){
System.out.println("bbb"+i);
}
}
}
Thread t = new Thread02();
t.start();
线程的状态
线程同步
当多个线程访问同一个对象(临界资源)时,会破坏原子操作(不可分割的操作),会出现数据不一致的现象。
1.同步代码块
synchronized(obj){
//同步的代码
}//对代码块的代码进行加锁
每 一个Java对象的都有锁标记,活的锁标记进入同步代码块。
当同步代码块的内部执行完毕,会释放锁标记。
互斥锁标记 必须使用同一个Java对象。
2.同步方法
public synchronized void add(String s){
//同步方法内部
}
public void add(String s){
synchronized(this){
}
}
//使用thid作为锁对象,对方法内部的代码进行加锁。
只有获取到obj对象的锁标记,执行方法内部的代码方法执行完毕,释放锁标记。
线程通信
synchronized(obj){
t1
synchronized(obj1){
}
}
synchronized(obj1){
t2
synchronized(obj){
}
}
wait():
必须使用在对obj对象加锁同步代码块中
使当前线程陷入等待队列 --> 阻塞状态,同时释放锁标记
notify()/notifyAll():
必须使用在对obj对象加锁同步代码块中,
唤醒等待队列中的一个或全部 等待线程