目录
方式一:继承Thread
步骤:
例题1:遍历1-100以内所有偶数
方式二:实现Runnable接口
步骤:
比较创建线程的两种方式 开发中:优先选择:实现Runnable接口的方式 原因:1、实现的方式没有的类的单继承性的局限性 2、实现的方式更适合来处理多个线程有共享数据的情况
例二:创建三个窗口,总票数为100张
方式一:继承Thread
步骤:
/**
*多线程的创建,方式一:继承Thread
* 1、创建一个继承与Thread的子类
* 2、重写Thread的run()方法------>将线程执行的操作声明在方法内
* 3、创建Thread类的对象
* 4、同构此对象调用start();
* @author: ----千里之行,始于足下----
* date: 2022/8/11 18:33
* @since JDK 1.8
*/
例题1:遍历1-100以内所有偶数
public class Test1 extends Thread{
// 重写Thread的run方法
@Override
public void run() {
for(int i=1;i<=100;i++){
if(i%2==0){
System.out.println(i);
}
}
}
static class Test2 {
public static void main(String[] args) {
Test1 te1 = new Test1();
// start的作用①启动线程,②调用当前线程的run()方法
te1.start();
// 不能直接调用run()方法的方式启动线程
// te.run();
// 如果再次使用start启动线程,会出行异常:IllegalThreadStateException
// te1.start();
// 若想使用多个线程需要新造对象
Test1 te2 = new Test1();
te2.start();
// 如下操作依然在main线程里执行
for (int i = 0; i < 100; i++) {
if (i % 2 != 0) {
System.out.println(i + "***************");
}
}
}
}
}
方式二:实现Runnable接口
步骤:
/**
*创建多线程的方式二:实现Runnable接口
* 1、创建一个实现Runnable接口的类
* 2、实现类去实现Runnable中的抽象方法:run()
* 3、创建实现类的对象
* 4、将此对象作为参数传递到Thread类的构造其中,创建Thread类的对象
* 5、通过Thread类的对象调用start()
*
* 联系:public class Thread implements Runnable
* 相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。
*/
class MyThread implements Runnable{
// 重写Runnable的方法
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i%2==0){
// Thread.currentThread().getName():表示调用当前方法的线程名
System.out.println(Thread.currentThread().getName()+"--"+i);
}else {
break;
}
}
}
}
public class Test4 {
public static void main(String[] args) {
MyThread myThread=new MyThread();
// t1是线程,创建多线程时,只需要new Thread();就行
Thread t1 =new Thread(myThread);
Thread t2 =new Thread(myThread);
// ①启动线程
// ②调用当前线程的run()-->调用了Runnable类型的target的run()
// ③setName:设置线程名
t1.setName("线程一");
t1.start();
t2.setName("线程二");
t2.start();
}
}
比较创建线程的两种方式
开发中:优先选择:实现Runnable接口的方式
原因:1、实现的方式没有的类的单继承性的局限性
2、实现的方式更适合来处理多个线程有共享数据的情况
例二:创建三个窗口,总票数为100张
/**
* Description:
*
*例子:
*
* @author: ----千里之行,始于足下----
* date: 2022/8/11 20:26
* @since JDK 1.8
*/
class Window extends Thread{
private static int ticket = 100;
@Override
public void run() {
while (true){
if(ticket > 0){
// getName:表示当前线程名,完整写法:this.getName()
System.out.println(getName()+"卖票,票票数还有:"+ticket);
ticket--;
}else {
break;
}
}
}
public static class WindowTest {
public static void main(String[] args) {
Demo1.Window t1 = new Demo1.Window();
Demo1.Window t2 = new Demo1.Window();
Demo1.Window t3 = new Demo1.Window();
t1.setName("窗口一");
t1.start();
t2.setName("窗口二");
t2.start();
t3.setName("窗口三");
t3.start();
}
}
}