zoukankan      html  css  js  c++  java
  • Java的多线程创建方法

    1. 直接使用Thread来创建

    package com.test.tt;
    
    public class ThreadEx extends Thread{
        private int j;
        
        public void run(){
            for(j=0; j<100;j++){
                System.out.println("当前的线程名称是:"+ getName() + " " +  "当前j的值是:" + j);
            }
        }
        
    
        public static void main(String[] args) {
            for(int h=0; h<100;h++){
                
                if(h==20){
    //这里新建了两个Thread对象 ThreadEx threadTest1
    = new ThreadEx(); ThreadEx threadTest2= new ThreadEx(); threadTest1.start(); threadTest2.start(); } System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前h的值是:" + h); } } }

    2. 通过实现Runnable接口,并将Runnable实现对象作为Thread的Target的方式创建

    注:区别于第一种方法,这里可以达到两个线程共享变量i的目的。

    package com.test.tt;
    
    public class RunnableEx implements Runnable{
        
        private int i;
        @Override
        public void run() {
            for(i=0; i<100;i++){
                System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " +  "当前i的值是:" + i);
            }
            
        }
    
        public static void main(String[] args) {
            for(int j=0;j<100;j++){
                System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " +  "当前j的值是:" + j);
                if(j==20){
                    RunnableEx REx=new RunnableEx();
    //这里也新建了两个Thread对象,但是里面的Target是同一个Runnable实现类对象 Thread thread1
    = new Thread(REx, "实例1"); Thread thread2 = new Thread(REx, "实例2"); thread1.start(); thread2.start(); } } } }

    3. 通过实现Callable接口的方式创建(这是一个具有返回值的创建方式)

    注:FutureTask只能启动一个线程

    package com.test.tt;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;
    
    public class CallableEx implements Callable{
        @Override
        public Object call() throws Exception {
            int i =0;
            for(;i<1000;i++){
                System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " +  "当前i的值是:" + i);            
            }
            return i;
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            CallableEx CEx = new CallableEx();
            FutureTask<Integer> task = new FutureTask<Integer>(CEx);
            
            for(int j=0;j<1000;j++){
                System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " +  "当前i的值是:" + j);
                if(j==200){
                    Thread thread1 = new Thread(task, "实例1");
                    thread1.start();
                }            
            }
            
            try{
    //这里的get()方法可以获取到子线程的返回值,而且在执行时会中断main线程 System.out.println(
    "线程的返回值:" + task.get()); }catch(Exception ex){ ex.printStackTrace(); } } }
  • 相关阅读:
    Android源码4.4.4_r1下载和编译
    [转]【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
    Android C语言_init函数和constructor属性及.init/.init_array节探索
    阅读android源码了解 android 加载so的流程
    div嵌套内层div的margin-top转移给外层div的解决办法
    实现在一个页面内,点击导航栏的不同链接,跳转到不同的页面
    当导航栏滚动到浏览器顶部时,固定导航栏
    如何在ios手机端的Safari浏览器 中“查看网页源代码”
    带有可点击区域的图像映射:HTML <map> 标签
    网页中如何使用一些特殊字体
  • 原文地址:https://www.cnblogs.com/moonpool/p/5472549.html
Copyright © 2011-2022 走看看