zoukankan      html  css  js  c++  java
  • hadoop06---多线程

    .1.1. 实现线程的两种方式

    1、继承Thread方式

    见代码MyThreadWithExtends

    2声明实现 Runnable 接口的方式

    见代码MyThreadWithImpliment

    package cn.itcast_01_mythread.thread.testThread;
    
    import java.util.Random;
    
    public class MyThreadWithExtends extends Thread {
        String flag;
        float g = 1;
        
        public MyThreadWithExtends(String flag){
            this.flag = flag;
        }
    
        @Override
        public void run() {//并没有看出来线程1和线程2各自独有的。
            float f = 1;
            f++;//f是线程的值
            g++;//g是堆对象的值
            System.out.println("f:"+f);
            System.out.println("g:"+g);
            String tname = Thread.currentThread().getName();
            System.out.println(tname+"线程的run方法被调用……");
            Random random = new Random();
            for(int i=0;i<2;i++){
                try {
                    Thread.sleep(random.nextInt(10)*100);
                    System.out.println(tname+ "...."+ flag);//flag是堆对象的值,不同的线程和相同的线程来调用这个方法,都是对象里面的值。
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            Thread thread1 = new MyThreadWithExtends("a");
            Thread thread2 = new MyThreadWithExtends("b");
            /*
            有独立的变量作用域。
            run方法是共用的,但是不同线程调的。
            f:2.0
            f:2.0
            g:2.0
            g:2.0
            Thread-1线程的run方法被调用……
            Thread-0线程的run方法被调用……
            Thread-0....a
            Thread-1....b
            Thread-0....a
            Thread-1....b
             */
    //        thread1.start();
    //        thread2.start();
            /**
                    如果是调用thread的run方法,则只是一个普通的方法调用,不会开启新的线程
                    都在主线程运行,所有的变量共享。thread1,thread2是2个堆中的变量。
                run方法是共用的,但是都是主线程调的。
                f:2.0
                g:2.0
                main线程的run方法被调用……
                main....a
                main....a
                f:2.0
                g:2.0
                main线程的run方法被调用……
                main....b
                main....b
             */
            thread1.run();
            thread2.run();
        }
    }
    package cn.itcast_01_mythread.thread.testThread;
    
    
    public class MyThreadWithImpliment implements Runnable {
        int x;
    
        public MyThreadWithImpliment(int x) {
            this.x = x;
        }
    
        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.println("线程" + name + "的run方法被调用……");
            for (int i = 0; i < 10; i++) {
                System.out.println(x);
                try {
                    Thread.sleep(100);
                    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            Thread thread1 = new Thread(new MyThreadWithImpliment(1), "thread-1");
            Thread thread2 = new Thread(new MyThreadWithImpliment(2), "thread-2");
    //         thread1.start();
    //         thread2.start();
            // 注意调用run和调用start的区别,直接调用run,则都运行在main线程中
            thread1.run();
            thread2.run();
        }
    }
  • 相关阅读:
    merge into语句的使用
    mybatis框架下解决数据库中表的列的字段名和实体类属性不相同的问题
    Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息
    Mybatis框架基于注解的方式,实对数据现增删改查
    java中的泛型和sql中的索引
    SpringMVC框架下的异常处理
    SpringMVC框架下的拦截器
    在SpringMVC框架下实现数据的国际化(即数据实现多国文字之间的转换)
    Java 随机数生成工具RandomUtils
    Java 获取客服端ip地址
  • 原文地址:https://www.cnblogs.com/yaowen/p/9006614.html
Copyright © 2011-2022 走看看