实现线程的第二种方法
提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体。
代码示例:
public class Runnablempl implements Runnable {
public void run() {
for(int i=0;i<30;i++){
System.out.println("Runnable-->"+i);
if(i==15){
try {
Thread.sleep(2000); //休眠2000毫秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] Args){
//生成一个Runnable接口实现类对象
Runnablempl ri=new Runnablempl();//ri 代表线程体
//生成一个Thread对象,并将Runnable接口实现类的对象作为参数
//传递给该Thread对象
Thread t=new Thread(ri);
//设置优先级(1~10),可以使用Thread所提供的静态常量来设 //置线程的优先级
t.setPriority(Thread.MAX_PRIORITY);
//通知Thread对象执行start方法
t.start(); //t 代表线程
System.out.println(t.getPriority());
}
}
线程的简单控制方法
·中断线程
— Thread.sleep() //使线程休眠
— Thread.yield() //释放CPU,重新来争夺CPU的控制权
·设置线程的优先级
— getPriority() //获取线程优先级
— setPriority() //设置优先级
多线程数据安全
当多线程共用一个方法体时,要加锁,不然会产生数据重复使用。
关键字:synchronized(this){加锁后要执行的代码,直到代码执行完后才开锁 }
public class MyThread implements Runnable {
int i=30;
//复写run方法
public void run() {
while(true){
//加锁
synchronized(this){
//currentThread()方法是Thread()的静态方法,
//用来获取这段代码正在那个线程当中运行
System.out.println(Thread.currentThread().getName()+i);
i--;
Thread.yield();
if(i<0){
break;
}
}
}
}
}
public class Test1 {
public static void main(String[] Args){
MyThread myThread=new MyThread();
//生成两个Thread对象,但是这两个Thread对象共用同一个线程体
Thread t1=new Thread(myThread);
Thread t2=new Thread(myThread);
//每一个线程都有名字,可以使用getName方法设置线程名字,
//也可以使用getName方法获取线程名字;
t1.setName("线程a");
t2.setName("线程b");
t1.start();
t2.start();
}
}