[size=medium]线程是什么?
线程指的是两件不同的事情:
1,java.lang.Thread的一个实例
2,线程的执行一个Thread实例只是一个对象。像Java中的任何其他对象一样,具有变量和方法,生死在堆上。但是线程的执行时一个单独的进程,有自己的调用栈。每个线程都有自身的调用栈。
不同的JVM可能以不同的方式来运行线程,例如可能在一个jvm上,各个线程分时运行,而有的JVM必须要保证一个线程执行完毕,才能进行切换。
初始化线程实例:
Thread t = new Thread();
或Runnable r = new MyRunnable();
Thread t = new Thread(r);
注意Thread本身实现了Runable接口,所以可以将thread作为Thread t = new Thread();的参数。注意线程执行的次序是没有保障的,并不一定先调用start的thread,就一定先run。当线程执行完其run方法后,不再是一个执行过程,该线程的栈解散。
如果线程已经启动,就不能再次调用start方法启动,会导致异常IllegalThreadStateException。
我们可以使用一些方法来影响线程的调度顺序,记住,是影响,不是控制,只有JVM才能真正控制线程调度。
来自Thread类的方法:
public static void sleep(long sleeptime) throws InterruptedException
public static void yield()
public final void join()throws InterruptedException
public final void setPriority(int newPriority)
位于Object类中的方法有:
public final void notify()
public final void notifyAll()
public final void wait()throws InterruptedException[/size]
线程指的是两件不同的事情:
1,java.lang.Thread的一个实例
2,线程的执行一个Thread实例只是一个对象。像Java中的任何其他对象一样,具有变量和方法,生死在堆上。但是线程的执行时一个单独的进程,有自己的调用栈。每个线程都有自身的调用栈。
不同的JVM可能以不同的方式来运行线程,例如可能在一个jvm上,各个线程分时运行,而有的JVM必须要保证一个线程执行完毕,才能进行切换。
初始化线程实例:
Thread t = new Thread();
或Runnable r = new MyRunnable();
Thread t = new Thread(r);
注意Thread本身实现了Runable接口,所以可以将thread作为Thread t = new Thread();的参数。注意线程执行的次序是没有保障的,并不一定先调用start的thread,就一定先run。当线程执行完其run方法后,不再是一个执行过程,该线程的栈解散。
如果线程已经启动,就不能再次调用start方法启动,会导致异常IllegalThreadStateException。
我们可以使用一些方法来影响线程的调度顺序,记住,是影响,不是控制,只有JVM才能真正控制线程调度。
来自Thread类的方法:
public static void sleep(long sleeptime) throws InterruptedException
public static void yield()
public final void join()throws InterruptedException
public final void setPriority(int newPriority)
位于Object类中的方法有:
public final void notify()
public final void notifyAll()
public final void wait()throws InterruptedException[/size]
package threadExamples;
class Printer implements Runnable {
private String message;
public Printer(String s) {
this.message = s;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(message);
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 500; i++) {
System.out.println("Nice");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} // 新线程要等待,必须在run方法中sleep
}
System.out.println("End of mythread");
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {//主线程
MyThread t = new MyThread();
t.start(); //启动线程,会和主线程交替执行
for (int i = 0; i < 1000; i++) {
System.out.println("Good");
}
Printer p = new Printer("*");
Printer p1 = new Printer("+");
p.run();
p1.run(); // 注意: 单线程,只是由main调用run方法,并没有启动线程
// 输出时先是*,后是+,不会出现二者交替输出的情况
System.out.println("End of main");
}
}