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(); } } }
  • 相关阅读:
    Java学习二十九天
    Java学习二十八天
    47. Permutations II 全排列可重复版本
    46. Permutations 全排列,无重复
    subset ii 子集 有重复元素
    339. Nested List Weight Sum 339.嵌套列表权重总和
    251. Flatten 2D Vector 平铺二维矩阵
    217. Contains Duplicate数组重复元素
    209. Minimum Size Subarray Sum 结果大于等于目标的最小长度数组
    438. Find All Anagrams in a String 查找字符串中的所有Anagrams
  • 原文地址:https://www.cnblogs.com/moonpool/p/5472549.html
Copyright © 2011-2022 走看看