线程的定义:线程是一个进程内部的一个运行单元,线程是顺序执行的, 一个进程至少包含一个线程,多个线程之间共享进程内存的, 每一个线程又有自己独立的栈内存。
线程的创建方式:
1.继承Thread: 重写run方法,创建对象,调用start启用;
2.实现Runnable接口(多个线程需要共享同一个对象时使用):重写run方法,创建对象,将对象包装成线程对象,调用start方法启用;
3.继承定时任务类(TimerTask)可以知道时间执行: 重写run方法,创建定时任务对象,创建定时器Timer(java.util中)对象,调用schedule方法启动定时任务。
线程中start()方法的使用:
start()方法只是给虚拟机一个信号,当前这个线程可以执行run方法了, 线程的run方法什么时候执行是由CPU调度的。
线程的状态【线程的生命周期】
NewThread --新建状态 一个线程对象被创建,但还没有启用start方法
Runnable --就绪状态(可运行状态) 当线程调用可start方法之后,run方法执行之前
Running --运行状态 线程正在执行run方法
No Runnable--挂起状态(非运行状态) 线程在运行途中暂时不执行
Dead --死亡状态 线程执行完毕,退出
线程中重要的方法及含义:
Thread.currentThread() 获得当前线程的对象
Thread.sleep(毫秒) 当前线程休眠指定毫秒数
Thread.setPriority() 设置线程的优先级
Thread.getPriority() 获得线程的优先级
Thread.join() 等待该线程执行完毕
Thread.yield() 暂停当前正在执行的线程对象并执行其他的线程
Thread.getstate() 获得线程的状态
Thread.isAlive() 是不是活动的线程
线程的优先级:min_priority=1,Morm_priority=5,max_priority=10(常用这三个,不过1-10都可以用,但不可以超出此范围,默认是5),线程的优先级可以从1-10,数字越大,优先级越高,优先级高的线程会获得更多的时间片段来执行。
守护线程:所有普通线程结束守护线程不管是否执行完毕都会结束,守护线程一般写为死循环,在start之前加上SetDaemon(true)。
1.线程默认是异步的:多个线程可以同时操作同一个数据[同一块内存]
2.线程的同步:线程不能同时操作同一个数据
读取可以是异步操作,但修改只能是同步操作
3.如何实现线程的同步?
同步锁(synchronized):
方式一:使用synchronized(对象)锁住需要同步的代码块
synchronized(对象){}
方式二:使用synchronized锁住需要同步的方法
public synchronized void 方法名(){}
方式三:从JDK1.5开始提供的对象锁
Lock 锁名=new ReentrantLock();
锁名.lock();//上锁
锁名.unlock();//解锁
方式四:使用wait-notify机制