目录
比较创建线程的两种方式 开发中:优先选择:实现Runnable接口的方式 原因:1、实现的方式没有的类的单继承性的局限性 2、实现的方式更适合来处理多个线程有共享数据的情况
/** *多线程的创建,方式一:继承Thread * 1、创建一个继承与Thread的子类 * 2、重写Thread的run()方法------>将线程执行的操作声明在方法内 * 3、创建Thread类的对象 * 4、同构此对象调用start(); * @author: ----千里之行,始于足下---- * date: 2022/8/11 18:33 * @since JDK 1.8 */
- 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接口 * 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();
- }
- }
/**
* 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();
-
- }
- }
- }
