线程是一个程序中的不同的执行的路径, 每一个分支都叫线程。
进程只是一个静态的概念,在我们机会里面其实运行都是线程。进程(主线程)包含很多线程。
Java创建线程有2种方式:
1、实现Runnable接口(推荐):
class Runnable1 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("in Runnable1 i="+i);
}
}
}
2、继承Thread类:
class Runnable2 extends Thread{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("in Runnable2 i="+i);
}
}
}
线程的调用:
//实现Runnable接口的调用方式
Runnable1 r=new Runnable1();
Thread t=new Thread(r);
t.start();//启动一个线程 //问题1:启动一个线程,让线程去执行run()方法中的代码,与直接去调用run()是有巨大的区别的
//调用继承extends Thread类的线程
Runnable2 r=new Runnable2();
r.start(); //启动一个线程
线程睡眠sleep:
Thread.sleep(1000); //表示当前线程睡眠1000毫秒
//如果写在主线程中,就是让主线程睡眠;反之如果写在子线程run方法中,就是让子线程睡眠
package org.zhanghua.javase.demo.thread;
/**
* 线程演示sleep
* @author Edward
*
*/
public class SleepTest{
public static void main(String[] args) {
System.out.println("sleep前:"+System.currentTimeMillis());
try {
Thread.sleep(1000); //表示当前线程(主线程)睡眠1000毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sleep后:"+System.currentTimeMillis());
//实现Runnable接口的调用方式
Runnable1 r=new Runnable1();
Thread t=new Thread(r);
t.start();//启动一个线程
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000); //表示当前线程(主线程)睡眠1000毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("in main i="+i);
}
}
}
/**
* 线程类
* @author Administrator
*
*/
class Runnable1 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500); //让当前线程(Runnable1)睡眠1000毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("in Runnable1 i="+i);
}
}
}
合并线程Join:
join()方法表示合并,相当于方法调用。
打断线程有2种方法:
interrupt() 不推荐 表示打断线程(不友好)
stop() 积不推荐 强制结束线程(直接关闭,比如杀死进程)
退让线程Yield():
yield() 标识退出当前线程进入就绪状态,让给别的线程执行一下。
线程状态图:
线程优先级:
线程优先级由数字表示,范围1-10,一个线程的缺省优先级是5
//Thread.MIN_PRIORITY=1
//Thread.MAX_PRIORITY=10
//Thread.NORM_PRIORITY=5
设置线程优先级方法和获取线程优先级方法
int getPriority() 获取线程优先级
void setPriority(int newPriority) 设置线程优先级
线程常用基本方法: