Runnable接口
Runnable是任务类,它的void run()函数应该在子类中被重写为任务流程。
Thread类(线程类)。
Thread currentThread():静态方法,返回正在运行的线程,当然也就是本线程。
Thread(ThreadGroup group, Runnable target, String name):构造一个执行target任务(本体)的线程,线程属于线程池group,名叫name.
新建线程的初始优先级被设定为与父线程一样;当且仅当父线程是守护线程时,新建线程才是守护线程。当所有的用户线程都已经结束的时候,jvm就会退出。
group为null时,线程所属的线程池由系统分配;name为null时,线程的名称由系统分配;target为null时,线程会把自己的run函数当作任务流程。
Thread(),Thread(Runnable target),Thread(String name),Thread(ThreadGroup group, Runnable target),Thread(ThreadGroup group, String name),Thread(Runnable target, String name):缺席的参数相当于被设为null.
void start():开始执行任务流程。如果构造函数中指定了任务,那么任务流程就是任务的void run()函数,否则,任务流程就是线程自己的void run()函数。
void run():参见上面。
线程对象只能被启动一次,不可以多次start,也不可以在线程结束之后又一次start.
void yield():放弃执行权转为就绪状态,让调度器重新调度一次。调度的结果可能还是让本线程执行,导致本线程再次转入运行状态。
void sleep(long millis):睡眠millis毫秒。
void sleep(long millis, int nanos):睡眠millis毫秒+nanos纳秒。
void interrupt():中断线程,不一定会成功。
boolean interrupted():返回线程是否处于中断状态,并让线程继续。
boolean isInterrupted():返回线程是否处于中断状态,没有额外动作。
boolean isAlive():如果线程已经启动而尚未结束,则返回true.
int getPriority():返回线程优先级。
void setPriority(int newPriority):设置线程优先级。如果newPriority大于所在线程组所允许的最高优先级,则设置为线程组允许的最高优先级。
String getName(),void setName(String name):返回/设置线程名称。
ThreadGroup getThreadGroup():返回所属的线程池。如果线程已经结束,则返回null.
boolean isDaemon():如果线程是守护线程,则返回true,否则返回false.
void setDaemon(boolean on):如果on为true,则将线程设置为守护线程,否则设置为用户线程。注意这个设置必须在线程start前进行。
long getID():返回线程ID。线程名称可以重复,但是线程ID是唯一的。线程ID在线程创建时由系统分配,在线程结束后可以被重新使用。
String toString():返回线程的信息,包括名称、优先级、所属线程池等。
void join():如果线程a想要等到线程b结束之后再往下走,那么就可以用b.join()等待b结束。
void join(long millis),void join(long millis, int nanos):也是等待线程结束,但是有超时。
创建线程示例
方法一:创建无任务Thread
class MyThread extends Thread
{
public void run()
{流程}
}
MyThread myThread = new MyThread();
myThread.start();
方法二:创建带任务Thread
class MyTarget implements Runnable
{
public void run()
{流程}
}
MyTarget myTarget = new MyTarget();
Thread myThread = new Thread(myTarget);
myThread.start();
方法二中,如果用一个任务创建了多个线程,由于所有线程执行的都是任务本体,所以任务的成员变量会被所有线程所共享。例如,
class MyTarget implements Runnable
{
private int ticket = 5; //5张票
public void run()
{
while(true)
{
if(this.ticket > 0)
System.out.println(Thread.currentThread().getName()+"正在卖票"+this.ticket--);
}
}
}
public class test
{
public static void main(String[] args)
{
MyTarget myTarget = new MyTarget();
new Thread(myTarget, "1号窗口").start();
new Thread(myTarget, "2号窗口").start();
new Thread(myTarget, "3号窗口").start();
}
}
运行结果可能为