java线程练习题及答案
System.out.println("Runner A="+i);
}
}
class T2 implements Runnable{
public void run(){
for(int j=0;j<15;j++)
System.out.println("Runner B="+j);
}
}
public classThreadTest{
public static void sleep(long millis, int nanos) throws InterruptedException
使当前正在执行的线程暂时停止执行指定的毫秒时间。指定时间过后,线程继续执行。该方法抛出InterruptedException异常,必须捕获。
public void run()线程的线程体。
注意cp作为线程构造方法的第一个参数,该参数必须是实现了Runnable接口的对象并提供线程运行的run()方法,第二个参数是线程名。
Thread类的常用方法有:
public static Thread currentThread()返回当前正在执行的线程对象的引用。
public void setName(String name)设置线程名。
public String getName()返回线程名。
public static void sleep(long millis) throws InterruptedException
try{
sleep((int)(Math.random()*100));
}catch(InterruptedException e){}
}
System.out.println(getName()+ " DONE");
}
}
_____________________________________________________________________________▃
多线程(multi-thread)是指在单个的程序内可以同时运行多个不同的线程完成不同的任务,图2说明了一个程序中同时有两个线程运行。
图1单线程程序示意图图2多线程程序示意图
有些程序中需要多个控制流并行执行。例如,
for(int i = 0; i < 100; i++)
System.out.println("Runner A = " + i);
这个方法要由实现了Runnable接口的类实现。Runnable对象称为可运行对象,一个线程的运行就是执行该对象的run()方法。
Thread类实现了Runnable接口,因此Thread对象也是可运行对象。同时Thread类也是线程类,该类的构造方法如下:
public Thread()
public Thread(Runnable target)
publicclass SimpleThread extends Thread{
public SimpleThread(String str){
super(str);
}
public void run(){
for(int i=0; i<100; i++){
System.out.println(getName()+"= "+i);
public Thread(String name)
public Thread(Runnable target, String name)
public Thread(ThreadGroup group, Runnable target)
public Thread(ThreadGroup group, String name)
作为单个顺序控制流,线程必须在运行的程序中得到自己运行的资源,如必须有自己的执行栈和程序计数器。线程内运行的代码只能在该上下文内。因此还有些教程将执行上下文(execution context)作为线程的同义词。
所有的程序员都熟悉顺序程序的编写,如我们编写的名称排序和求素数的程序就是顺序程序。顺序程序都有开始、执行序列和结束,在程序执行的任何时刻,只有一个执行点。线程(thread)则是进程中的一个单个的顺序控制流。单线程的概念很简单,如图1所示。
public Thread(ThreadGroup group, Runnable target, String name)
target为线程运行的目标对象,即线程调用start()方法启动后运行那个对象的run()方法,该对象的类型为Runnable,若没有指定目标对象,则以当前类对象为目标对象;name为线程名,group指定线程属于哪个线程组(有关线程组的概念请参考9.6节)。
}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+ " DONE");
}
从上述代码执行结果可以看到,在应用程序的main()方法启动时,JVM就创建一个主线程,在主线程中可以创建其他线程。
public void start() {
if (clockThread == null) {
clockThread = new Thread(cp, "Clock");
clockThread.start();
}
}
当该语句执行后clockThread就处于新建状态。处于该状态的线程仅仅是空的线程对象,并没有为其分配系统资源。当线程处于该状态,你仅能启动线程,调用任何其他方法是无意义的且会引发IllegalThreadStateException异常(实际上,当调用线程的状态所不允许的任何方法时,运行时系统都会引发IllegalThreadStateException异常)。
public statiபைடு நூலகம் void main(String args[]){
Thread t1=new Thread(new T1(),"Thread A");
Thread t2=new Thread(new T2(),"Thread B");
t1.start();
t2.start();
}
}
_____________________________________________________________________________▃
线程与线程类
1
线程的概念来源于计算机的操作系统的进程的概念。进程是一个程序关于某个数据集的一次运行。也就是说,进程是运行中的程序,是程序的一次运行活动。
线程和进程的相似之处在于,线程和运行的程序都是单个顺序控制流。有些教材将线程称为轻量级进程(light weight process)。线程被看作是轻量级进程是因为它运行在一个程序的上下文内,并利用分配给程序的资源和环境。
再看下面的程序:
程序MainThreadDemo.java
public classMainThreadDemo{
public static void main(String args[]){
Thread t=Thread.currentThread();
t.setName("MyThread");
System.out.println(t);
该程序输出结果为:
Thread[MyThread, 5, main]
MyThread
main
上述程序在main()方法中声明了一个Thread对象t,然后调用Thread类的静态方法currentThread()获得当前线程对象。然后重新设置该线程对象的名称,最后输出线程对象、线程组对象名和线程对象名。
可以定义一个类实现Runnable接口,然后将该类对象作为线程的目标对象。实现Runnable接口就是实现run()方法。
下面程序通过实现Runnable接口构造线程体。
程序ThreadTest.java
class T1 implements Runnable{
public void run(){
for(int i=0;i<15;i++)
Thread t2=new SimpleThread("Runner B");
t1.start();
t2.start();
}
}
_____________________________________________________________________________▃
在ThreadTest类的main()方法中创建了两个SimpleThread类的线程对象并调用线程类的start()方法启动线程。构造线程时没有指定目标对象,所以线程启动后执行本类的run()方法。
public void start()由JVM调用线程的run()方法,启动线程开始执行。
public void setDaemon(boolean on)设置线程为Daemon线程。
public boolean isDaemon()返回线程是否为Daemon线程。
public static void yield()使当前执行的线程暂停执行,允许其他线程执行。
public ThreadGroup getThreadGroup()返回该线程所属的线程组对象。
public void interrupt()中断当前线程。
public boolean isAlive()返回指定线程是否处于活动状态。
本节介绍如何创建和运行线程的两种方法。线程运行的代码就是实现了Runnable接口的类的run()方法或者是Thread类的子类的run()方法,因此构造线程体就有两种方法: