class testClass{
@Test
public void test2() {
// TODO Auto-generated method stub
Bank bank = new Bank();
bank.setMoney(300);
bank.kuaiji.start();
bank.chuna.start();
}
}
在Java中创建线程有两种方法:继承Thread类或者实现Runnable接口
1、通过继承Thread类创建线程
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;font-size:18px;">// 通过继承Thread类创建线程
class Thread1 extends Thread {
Thread1() {
}
// 实现抽象类Thread的抽象方法方法
public void run() {
int i = 0;
while (true) {
System.out.println("Thread1:" + i++);
}
}
}</span></span>
2.通过实现Runnable接口创建线程
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;font-size:18px;">// 通过实现Runnable接口创建线程
class Thread2 implements Runnable {
Thread2() {
}
// 实现接口Runnable的abstract方法
public void run() {
int i = 0;
while (true) {
System.out.println("Thread2:" + i++);
}
}
}</span></span>
不管使用哪种方法都要实现抽象方法run().
创建线程的实例代码:
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;font-size:18px;">public class TestThread1 {
@Test
public void test() throws InterruptedException {
Thread1 thr1 = new Thread1();
Thread thr2 = new Thread(new Thread2());
thr1.start();
thr2.start();
}
}</span></span>
为什么我们不直接调用run()方法而是调用start()方法启动线程呢?因为线程的运行需要本地操作系统的支持,直接调用run()方法和普通方法没什么区别的。
创建线程时这两种方法怎么选择?
1.线程中有资源的共享时,Runnable实现起来比较容易方便。
2.类继承了其他父类而不能继承Thread类时,使用Runnable。
用Runnable实现变量共享的例子:
<span style="font-family:FangSong_GB2312;font-size:18px;">
</span><pre name="code" class="java">class testClass{
@Test
public void test2() {
// TODO Auto-generated method stub
Bank bank = new Bank();
bank.setMoney(300);
bank.kuaiji.start();
bank.chuna.start();
}
}
class Bank implements Runnable {
private int money = 0; // kuaiji,chuna两个线程共享money
Thread kuaiji, chuna; // 把两个线程定义为成员变量
Bank() {
kuaiji = new Thread(this);
kuaiji.setName("kuaiji");
chuna = new Thread(this);
chuna.setName("chuna");
}
// 通过方法设置money的初值
public void setMoney(int mount) {
money = mount;
}
public void run() {
while (true) {
money = money - 50;
if (Thread.currentThread() == kuaiji) {
System.out.println("我是" + kuaiji.getName() + "现在有:" + money
+ "元");
if (money <= 150) {
System.out.println(kuaiji.getName() + "进入死亡状态");
return;
}
} else if (Thread.currentThread() == chuna) {
System.out.println("我是" + chuna.getName() + "现在有:" + money
+ "元");
if (money <= 0)
return;
}
try {
Thread.sleep(800);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}