马士兵 note6
第九章 多线程
线程是一个程序内部的顺序控制流
线程和进程的区别:
每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销
线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程都有独立的运行栈和程序计数器,线程切换的开销小
多进程:在操作系统中能同时运行多个任务(程序
多线程:在同一应用程序中有多个顺序流同时执行
- Java的线程是通过java.lang.Thread类来实现的
- VM启动时会有一个由主方法(public static void main())所定义的线程
- 可以通过创建Thread的实例来创建新的线程
- 每个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体
- 通过调用Thread类的start()方法来启动一个线程
线程的创建和启动
第一种
定义线程类实现runnable接口
Thread myThread = new Thread(target)//target为Runnable接口类型
Runnable中只有一个方法:public void run();用于定义线程运行体
使用Runnable接口可以为多个线程提供共享的数据
在实现runnable接口的类的run方法定义中可以使用Thread的静态方法:
Public static Thread currentThread()获取当前线程的引用
public class ThreadTest1 { public static void main(String arg[]) { Runner1 runner1 = new Runner1(); //runner1.run(); Thread t = new Thread(runner1) ; t.start(); for(int i = 1;i<100;i++) { System.out.println("Main said---"+i); } } } class Runner1 implements Runnable{ public void run() { for(int i = 1;i<100;i++) { System.out.println("Thread said"+i); } } }
第二种
可以定义一个Thread的子类并重写其run方法如:
Class Mythread extends Thread{
Public void run(){}
}
然后生成该类的对象:
MyThread myThread = new MyThread()
只要能只用接口,就不要用thread类继承
isAlive() 判断线程是否还活着,即线程是否还未终止
getPriority() 获得线程的优先级数值
setPriority() 设置线程的优先级数值
Thread.sleep()将当前线程睡眠指定毫秒数
join()调用某线程的该方法,将当前线程与该线程合并,即等待该线程结束,再回复当前线程的运行
yield()让出cpu,当前线程进入就绪队列等待调度
wait()当前线程进入对象的wait pool
notify()/notifyAll()唤醒对象的wait pool中的一个/所有等待线程
sleep方法
可以调用Thread的静态方法;
public static void sleep(long milis) throws InterruptedException 使得当前线程休眠
由于是静态方法,sleep可以直接由类名调用: Thread.sleep(...)
join方法
合并某个线程,相当于方法调用
yield方法
让出CPU,给其他线程执行的机会
设置优先级:t1.setPriority(Thread.NORM_PRIORITY=3)
线程同步
synchronized 锁定当前对象
public synchronized void add(String name) { num++; try {Thread.sleep(1);} catch (InterruptedException e) {} // TODO: handle exception System.out.println(name+",you're the NO."+num+"..."); }
在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性
生产者消费者问题
wait() notify()
wait() sleep():
wait时别的线程可以访问锁定对象,调用wait方法的时候必须锁定该对象
sleep时别的线程也不可以访问锁定对象

浙公网安备 33010602011771号