zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java创建多线程的两种方式对比

JAVA多线程 方式 创建 对比 两种
2023-06-13 09:15:30 时间

采用继承Thead类实现多线程:

优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread()方法。

劣势:因为这种线程类已经继承了Thead类,所以不能再继承其它类。

示例代码:

复制代码代码如下:


 packageorg.frzh.thread;
 
 publicclassFirstThreadextendsThread{
    privateinti;
    
    //重写run方法,run方法的方法体就是线程执行体
    publicvoidrun(){
        for(;i<100;i++){
            //当线程类继承Thread类时,可以直接调用getName方法获得当前线程名
            //如果想获得当前线程,直接使用this
            //Thread对象的getName方法返回当前线程的名字
            System.out.println(getName()+""+i);
        }
    }
    
    publicstaticvoidmain(String[]args){
        for(inti=0;i<100;i++){
            //调用Thead的currentThread方法获取当前线程
            System.out.println(Thread.currentThread().getName()+""+i);
            if(i==20){
                newFirstThread().start();
                newFirstThread().start();
            }
        }
    }
 }

运行结果片段:

我们发现,在两个子线程中i的值并不连续,似乎与我们说的子线程直接共享数据不符。其实,在这里我们实例化了两个子线程,每个拥有自己的实例变量i。

采用实现Runable接口的多线程:

优势:线程类只是实现了Runable接口,因此还可以继承其他类;

        在这种情况下,可以使多个线程共享一个target对象,所以非常适合多个线程用来处理同一份资源的情况,从而可以将cpu、代码和数据分开,形成清晰的模型,较好的体现面向对象思想。

劣势:编程略有些复杂,如果要访问当前线程必须使用Thread.currentThread方法。

示例代码:

复制代码代码如下:


 packageorg.frzh.thread;
 
 publicclassSecondThreadimplementsRunnable{
    privateinti;
    
    @Override
    publicvoidrun(){
        //TODOAuto-generatedmethodstub
        for(;i<100;i++){
            System.out.println(Thread.currentThread().getName()+""+i);
        }
    }
    
    publicstaticvoidmain(String[]args){
        for(inti=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+""+i);
            if(i==20){
                SecondThreadst=newSecondThread();
                newThread(st,"子线程1").start();
                newThread(st,"子线程2").start();
            }
        }
    }
 
 }

运行结果片段:

可以看到,此时的i值是连续变化的,因为线程1和2共享同一个target。