方式1:继承Thread类,重写run()方法:
package _2创建多线程;
class MyThread extends Thread
{
@Override
public void run()
{
// 要同时做的事情:
System.out.println("小明开始听音乐");
for(int i=0;i<20;i++)
{
System.out.println("小明写听音乐中");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("小明写听音乐结束");
}
}
方式2:实现Runnable接口类,创建对象作为参数由Thread类来创建线程:
class MyRunnable implements Runnable
{
@Override
public void run() {
System.out.println("小明开始睡觉");
for(int i=0;i<20;i++)
{
System.out.println("小明睡觉中");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("小明睡觉结束");
}
}
demo示例:
public class TestDemo {
public static void main(String[] args)
{
// 方式1
// 开启一个新的线程来听音乐
MyThread t1 = new MyThread();
t1.start();
// start()方法: 开启一条新的线程,在这个新的线程中自动执行执行run()方法
// 这里不能写成
// t1.run();
// 这样就没有开新线程,而是在主线程中执行了run方法
// 方式2(常用)
Thread t2 = new Thread(new MyRunnable());
t2.start();
// 方式3(常用)
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("小明开始打LOL");
for(int i=0;i<20;i++)
{
System.out.println("小明打LOL中");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("小明开始打LOL结束");
}
});
t3.start();
// 在主线程执行主要代码
System.out.println("小明开始写代码");
for(int i=0;i<20;i++)
{
System.out.println("小明写代码中");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("小明写代码结束");
}
}