线程同步总结

 *    进程:
 *        正在运行的程序,是系统进行资源分配和调用的独立单位。
 *        每一个进程都有它自己的内存空间和系统资源。
 *    线程:
 *        是进程中的单个顺序控制流,是一条执行路径
 *        一个进程如果只有一条执行路径,则称为单线程程序。
 *        一个进程如果有多条执行路径,则称为多线程程序。

2种方式启动多线程

 * 方式1:继承Thread类。
 * 步骤
 *         A:自定义类MyThread继承Thread类。
 *         B:MyThread类里面重写run()?
 *             为什么是run()方法呢?
 *         C:创建对象
 *         D:启动线程

         MyThread my = new MyThread();
         // 启动线程
//         my.run();
//         my.run();
        // 调用run()方法为什么是单线程的呢?
        // 因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果
        // 要想看到多线程的效果,就必须说说另一个方法:start()
        // 面试题:run()和start()的区别?
        // run():仅仅是封装被线程执行的代码,直接调用是普通方法
        // start():首先启动了线程,然后再由jvm去调用该线程的run()方法。
        // MyThread my = new MyThread();
        // my.start();
        // // IllegalThreadStateException:非法的线程状态异常
        // // 为什么呢?因为这个相当于是my线程被调用了两次。而不是两个线程启动。
        // my.start();

        // 创建两个线程对象
        MyThread my1 = new MyThread();
        MyThread my2 = new MyThread();

        my1.start();
        my2.start();
/*
 * 该类要重写run()方法,为什么呢?
 * 不是类中的所有代码都需要被线程执行的。
 * 而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()用来包含那些被线程执行的代码。
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        // 自己写代码
        // System.out.println("好好学习,天天向上");
        // 一般来说,被线程执行的代码肯定是比较耗时的。所以我们用循环改进
        for (int x = 0; x < 200; x++) {
            System.out.println(x);
        }
    }

用对象设置名称

  • 方法1
        MyThread my1 = new MyThread("林青霞");
        MyThread my2 = new MyThread("刘意");
  • 方法2
         MyThread my1 = new MyThread();
         MyThread my2 = new MyThread();
//    //调用方法设置名称
         my1.setName("林青霞");
         my2.setName("刘意");

    thread中的方法

public class MyThread extends Thread {

    public MyThread() {
    }
    
    public MyThread(String name){
        super(name);
    }

@Override
public void run() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } } }

第二种方式

MyRunnable my = new MyRunnable();

        // 创建Thread类的对象,并把C步骤的对象作为构造参数传递
        // Thread(Runnable target)
        // Thread t1 = new Thread(my);
        // Thread t2 = new Thread(my);
        // t1.setName("林青霞");
        // t2.setName("刘意");

        // Thread(Runnable target, String name)
        Thread t1 = new Thread(my, "林青霞");
        Thread t2 = new Thread(my, "刘意");

接口类为

public class MyRunnable implements Runnable {

    @Override
    public void run() {
        for (int x = 0; x < 100; x++) {
            // 由于实现接口的方式就不能直接使用Thread类的方法了,但是可以间接的使用
            System.out.println(Thread.currentThread().getName() + ":" + x);
        }
    }

}

猜你喜欢

转载自www.cnblogs.com/G-JF/p/9326088.html