程序:为完成特定任务、用某种语言编写的一组指令的集合。一段静态的代码。
进程:是程序的一次执行过程,动态的正在运行的程序(进程是资源分配的最小单元)。
线程:程序内部的一条执行路径(线程是CPU调度的最小单元)。
start():启动当前线程;调用当前线程的run方法()
run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中
currentThread():静态方法,返回执行当前代码的线程
getName():获取当前线程的名字
setName():设置当前线程的名字
yield():释放当前cpu()的执行权
join():在线程a中调用线程b的join(),此时线程a进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态
stop():已过时,不推荐使用,强制结束当前线程。
sleep(long millitime):让当前线程睡眠(阻塞)指定时间(毫秒)。
isAlive():判断当前线程是否存活。
线程的优先级:
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
涉及的方法:
getPriority():返回线程优先值
setPriority(int newPriority()):改变线程的优先级
说明:
线程创建时继承父线程的优先级
低优先级只是获得调度的概率低,并非一定是在高优先级之后才被调用
/**
* 多线程的创建,方式一:继承Thread类
* 1,创建一个继承Thread类的子类
* 2,重写Thread类的run方法
* 3,创建Thread类的子类的对象
* 4,通过此对象调用start()
*
* 示例: 遍历100以内的所有偶数
* */
public class Thread1 {
public static void main(String[] args) {
MyThread t1 = new MyThread();
//启动当前线程;调用当前线程的run方法。
t1.start();
}
}
}
?
?
class MyThread extends Thread{
/**
* 创建多线程的方式二:实现Runnable接口
* 1.创建一个实现了Runnable接口的类
* 2.实现类去实现Runnable中的抽象方法:run()
* 3.创建实现类的对象
* 4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
* 5.通过Thread类的对象调用start()
* */
public class Thread2 {
public static void main(String[] args) {
MyThread2 myThread2 = new MyThread2();
Thread t1 = new Thread(myThread2);
t1.start();
}
}
?
class MyThread2 implements Runnable{
开发中:优先选择:实现Runnable接口的方式
原因:1,实现的方式没有类的单继承性的局限
2,实现的方式更适合来处理多个线程有共享数据的情况
synchronized(同步监视器){
//需要同步的代码(涉及到操作共享数据)
}
*同步监视器:俗称“锁”,任何一个类的对象都可以充当锁,多个线程共用一个锁--唯一性。
/**
如果操作共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明同步的
在方法体前加synchronized
*/
class Bank{
private static Bank instance = null;
public static Bank getInstance(){
if(instance == null){
synchronized(Bank.class){
if(instance == null){
instance = new Bank();
}
}
}
return instance;
}
}
不同的线程分别占用对方需要的同步资源不放弃,都等待对方放弃自己需要的同步资源。
package MyThread;
?
import java.util.concurrent.locks.ReentrantLock;
?
/**
* 解决线程安全问题方式三:Lock锁
*/
?
class Window implements Runnable{
private int ticket = 100;
//1,创建ReentrantLock对象
private ReentrantLock lock = new ReentrantLock();