zoukankan      html  css  js  c++  java
  • 线程同步总结

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

    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);
            }
        }
    
    }
  • 相关阅读:
    管理员技术(三): 配置静态网络地址、 使用yum软件源 、 升级Linux内核、查找并处理文件、查找并提取文件内容
    管理员技术(二): 访问练习用虚拟机、 命令行基础技巧 、 挂载并访问光盘设备、ls列表及文档创建、复制删除移动
    管理员技术(一):装机预备技能、安装一台RHEL7虚拟机、使用RHEL7图形桌面、Linux命令行基本操作
    基础(三):yum(RedHat系列)和apt-get(Debian系列 )用法及区别
    基础(二):Linux系统/etc/init.d目录和/etc/rc.local脚本
    基础(一):SCSI硬盘与IDE硬盘有什么区别
    高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器
    错题
    count 【mysql】
    自连接和子查询
  • 原文地址:https://www.cnblogs.com/G-JF/p/9326088.html
Copyright © 2011-2022 走看看