一.线程创建方式
1.方式一
编写类继承Thread,子类应该重写run方法,然后调用子类实例的start方法(非阻塞)启动线程,执行run方法里面的东西
package com.miracle.concurrency.chapter1;
public class TryConcurrency {
public static void main(String[] args) {
new Thread("READ-Thread"){
@Override
public void run() {
readFromDataBase();
}
}.start();
new Thread("WRITE-Thread"){
@Override
public void run() {
writeDataToFile();
}
}.start();
}
private static void readFromDataBase(){
// read data from database and handle it.
try {
println("Begin read data from db.");
Thread.sleep(1000 * 10L);
println("Read data done and start handle it.");
} catch (InterruptedException e) {
e.printStackTrace();
}
println("The data handle finish and successfully.");
}
private static void writeDataToFile(){
// read data from database and handle it.
try {
println("Begin write data to file.");
Thread.sleep(2000 * 10L);
println("Write data done and start handle it.");
} catch (InterruptedException e) {
e.printStackTrace();
}
println("The data handle finish and successfully.");
}
private static void println(String message) {
System.out.println(message);
}
}
2.方式二
- 定义类实现Runnable接口
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime){
this.minPrime = minPrime;
}
public void run(){
// compute primes lager than minPrime
...
}
}
- 开启线程
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
二.线程的生命周期
1.new状态
在代码中 new Thread() 时
2.runnable状态
调用start()时,线程不会立即执行,但此刻具备执行能力
3.running状态
当runnable状态的线程得到cpu调度,变成running状态,开始执行
4.blocked状态
线程执行过程中被block住(如代码调用了sleep,争抢锁等)
5.terminated状态
线程被终结
三.Thread API
1.构造方法
-
Thread();
创建线程对象Thread(空参构造),默认有一个线程名,以Threa-开头,从0开始计数 -
Thread(String name)
指定线程名的构造方法 -
Thread(Runnable target, String name)
指定运行目标target,和线程名字 -
Thread(ThreadGroup group, Runnable target, String name)
如果构造线程对象时为传入ThreadGroup,Thread会默认获取父线程的ThreadGroup,作为线程的ThreadGroup,此时子线程和父线程将会在同一个ThreadGroup中 -
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
stackSize:线程拥有的栈空间大小
2.方法
-
static int activeCount()
返回当前线程组的活跃线程的数量 -
static Thread currentThread()
返回当前执行线程的引用 -
static int enumerate(Thread[] tarray)
把当前线程组内的活跃线程 复制到 参数tarray中 -
long getId()
返回线程的id -
String getName()
返回线程的名字 -
void setDaemon(boolean on)
设置线程为守护线程