多线程的实现步骤
方式2:实现Runnable 接口
- 定义一个MyRunnable类实现Runnable 接口
- 在MyRunnable类中重写run()方法
- 创建MyRunnable类对象
- 创建Thread类对象,把MyRunnable对象作为构造方法的参数
启动线程
/*
方式2:实现Runnable 接口
● 定义一个MyRunnable类实现Runnable 接口
● 在MyRunnable类中重写run()方法
● 创建MyRunnable类对象
● 创建Thread类对象,把MyRunnable对象作为构造方法的参数
● 启动线程
*/
//1、定义一个MyRunnable类实现Runnable 接口
class MyRunnable implements Runnable{
//2、重写run()方法
public void run(){
for(int i=0;i<10;i++)
System.out.println(Thread.currentThread().getName()+":"+i+"次 优先级"+Thread.currentThread().getPriority());
try {
Thread.sleep(1000);//休眠1000ms
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public class MyRunnableDemo {
public static void main(String[] args) {
//3、创建Runnable对象
MyRunnable my=new MyRunnable();
//4、创建Thread类对象,把MyRunnable对象作为构造方法的参数
//Thread(Runnable target)
Thread t1=new Thread(my);//执行默认参数名
Thread t2=new Thread(my);
//Thread(Runnable target,String name)
Thread t3=new Thread(my,"高铁");//设置线程名称
Thread t4=new Thread(my,"火车");
//5、启动线程
t1.start();//未设置优先级,默认为5
try {
t1.join(); //t1线程执行完毕之后才能执行其他
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//设置优先级
t2.setPriority(10);
t3.setPriority(1);
t4.setPriority(5);
t2.start();
t3.start();
t4.start();
}
}
Thread-0:0次 优先级5
Thread-0:1次 优先级5
Thread-0:2次 优先级5
Thread-0:3次 优先级5
Thread-0:4次 优先级5
Thread-0:5次 优先级5
Thread-0:6次 优先级5
Thread-0:7次 优先级5
Thread-0:8次 优先级5
Thread-0:9次 优先级5
Thread-1:0次 优先级10
Thread-1:1次 优先级10
Thread-1:2次 优先级10
高铁:0次 优先级1
Thread-1:3次 优先级10
火车:0次 优先级5
Thread-1:4次 优先级10
高铁:1次 优先级1
高铁:2次 优先级1
Thread-1:5次 优先级10
火车:1次 优先级5
Thread-1:6次 优先级10
高铁:3次 优先级1
Thread-1:7次 优先级10
火车:2次 优先级5
高铁:4次 优先级1
高铁:5次 优先级1
Thread-1:8次 优先级10
高铁:6次 优先级1
火车:3次 优先级5
高铁:7次 优先级1
Thread-1:9次 优先级10
高铁:8次 优先级1
火车:4次 优先级5
火车:5次 优先级5
高铁:9次 优先级1
火车:6次 优先级5
火车:7次 优先级5
火车:8次 优先级5
火车:9次 优先级5
通过 Thread 类的构造函数
public Thread(Runnable target)
可以将一个Runnable 接口对象传递给线程,线程在调度时将自动调用Runnable 接口对象的run方法。public class Thread implements Runnable {
private Runnable target;
public Thread() {…}
public Thread( Runnable target ) {…}
public void run()
{
if (target!=null)
target.run(); 转而执行Runnable的target对象的run()方法
}
}
```java import java.util.*; class TimePrinter implements Runnable { int pauseTime; // 中间休息时间 String name; // 名称标识 public TimePrinter(int x , String n) {
pauseTime = x;
name = n;
} public void run() {
while(true) {
System.out.println(name + ": " +Calendar.getInstance().getTime());
try {
Thread.sleep(pauseTime);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
} public static void main(String args[ ]) {
Thread tp1 = new Thread( new TimePrinter(1000, "Fast") ); 【思考】此处为什么用Thread ?用TimePrinter或Runnable可以吗?暂时理解TimePrinter没有start()方法
tp1.start();
Thread tp2 = new Thread(new TimePrinter(3000, "Slow"));
tp2.start();
} }
Slow: Sun May 15 16:37:52 CST 2022 Fast: Sun May 15 16:37:52 CST 2022 Fast: Sun May 15 16:37:53 CST 2022 Fast: Sun May 15 16:37:54 CST 2022 Slow: Sun May 15 16:37:55 CST 2022 Fast: Sun May 15 16:37:55 CST 2022 Fast: Sun May 15 16:37:56 CST 2022 Fast: Sun May 15 16:37:57 CST 2022 Slow: Sun May 15 16:37:58 CST 2022 Fast: Sun May 15 16:37:58 CST 2022 Fast: Sun May 15 16:37:59 CST 2022 Fast: Sun May 15 16:38:00 CST 2022 Slow: Sun May 15 16:38:01 CST 2022 Fast: Sun May 15 16:38:01 CST 2022 ……
```java
import java.awt.*;
import java.awt.event.*;
public class Winning extends Frame implements Runnable {
String phoneNumber[ ] = { "15031204532", "13014156678", "13870953214", "13943123322", "18114156528" };
TextArea disp = new TextArea(4, 50); // 用来显示滚动号码
int pos = 0; //记录滚动到的索引位置
boolean flag; // 控制线程停止的标记变量
Button onoff; //启动、停止按钮
public static void main(String[ ] args) {
new Winning( );
}
public Winning( ) {
add("Center", disp);
onoff = new Button("begin");
add("South", onoff);
onoff.addActionListener(new ActionListener( ) {
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand( ).equals("begin"))
{
flag = true;
onoff.setLabel("end");
(new Thread(Winning.this)).start( );
}
else
{
flag = false; //设置线程停止标记
onoff.setLabel("begin");
}
}
});
setSize(200, 100);
setVisible(true);
}
public void run( )
{
while (flag)
{
int n = phoneNumber.length;
pos = (int) (Math.random( ) * n);
String message = phoneNumber[pos] + "\n"+ phoneNumber[(pos + 1) % n];
disp.setText(message);
}
}
}