Java 线程
程序:静态代码 安装到硬盘上
进程:运行中的程序 是操作系统分配资源的最小单位
线程:线程是进程(程序)中最小执行单元,是CPU进行调度的最小单位
? 一个进程中可以包含多个线程,线程不能脱离进程而存在
? 一个线程只能属于一个进程
? 例:运行中的 Q Q 进程
? 主线程 负责启动程序 例如:Java中的main 启动Java主线程
? 一个聊天窗口就是一个线程,可以独立运行
? 一个进程内的所有线程共享同一个进程的内存资源
单校CPU 1个时间节点上只能处理1个任务 快 切换执行多个任务
//Thread类 用于创建线程,操作线程的类 创建线程方式:继承Thread类
public class ThreadDemo extends Thread{
@Override
public void run(){
for(int i=0;i<1000;i++){
System.out.println("Thread"+i);
}
}
}
public class Test {
public static void main(String[] args) {
ThreadDemo td=new ThreadDemo ( );
td.start ();
for(int i=0;i<1000; i++){
System.out.println ("main"+i );
}
}
}
public class MyThread implements Runnable{
@Override
public void run() {
for(int i=0;i<1000;i++){
System.out.println ("自定义线程任务"+i );
}
}
}
public class Test{
public static void main(String[] args) {
MyThread myth=new MyThread ();
Thread th1=new Thread ( myth );
th1.start ();
for(int i=0;i<1000;i++){
System.out.println ("main:"+i );
}
}
}
Thread类中的方法:
run(); 用于执行任务
start(); 启动线程
Thread.currentThread()
Thread.currentThread().getName()
getName()
Thread(myth,"窗口!");
setName(String name);
setPriority();
getPriority();
Java的调度方法:同优先级线程组成先进先出队列,使用时间片策略
? 对于高优先级,使用优先调度的抢占式策略
ThreadDemo th=new ThreadDemo();
th.start();
th.join();
Thread.yield();
并行:多个cpu同时执行多个任务(一个时间节点同时做多件事情)
并发:一个cpu(采用时间片)同时执行多个任务(一个时间段内,依次执行多个事情)
多线程 线程之间对共享资源进行访问时,会出现线程安全问题
static修饰的变量是类变量,在内存中只有一份
synchronized(同步对象){ }同步对象可以是任意类的对象,但是只能唯一的,只有一份的
对象中有一个区域叫对象头,对象头中有一个锁状态的记录
进入同步代码块 加锁 也就将对象头锁状态改为加锁
同步代码块执行完后,会自动释放锁 也就将对象头锁状态改为无锁
继承Runnable接口: synchronized(this){ } //由于出票任务类,只创建了一个对象,所以两个线程拿到的this是同一个
static Lock lock=new ReentrantLock();
try{
lock.lock();
·
·
·
lock.unlock();
}catch(Exception e){
lock.unlock();
}
Synchronized 关键字 修饰代码块和方法 隐式的加锁、释放锁
? 底层实现靠虚拟机底层控制实现
Lock接口 ReentrantLock 实现类 ReentrantLock是类 只能修饰代码块
? 是显示地加锁、释放锁 只靠java代码控制实现
死锁 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需 要的同步资源
线程通信 通过线程间相互牵制实现线程之间切换执行 前提:必须是在同步代码块中使用
obj.wait();
obj.notify();
wait ()
notify()
notifyAll()
新增创建线程方式
实现Callable接口 与run()方法相比,有返回值;支持泛型的返回值;方法可抛出异常
需要借助FutureTask类接收任务
FutureTask<Intger> futureTask =new FutureTask();
Thread t = new Thread(futureTask);
t.start();
|