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(); } } }
  • 相关阅读:
    jquery.roundabout.js图片叠加3D旋转插件多功能图片翻转切换效果
    jquery.SuperSlide.js只需要调用一个插件就能实现网页大部分特效--推荐
    很不错的JS插件大全
    kxbdSuperMarquee.js滚动的神器-推荐
    琅琊榜
    三国群英2专题
    css中为了清除浮动经常用到的after样式
    非常简单的升级phpnow自带的php版本到5.3的方法
    手机访问网站如何自动跳转到手机版本自动转到手机网站
    php中几个字符串替换函数详解
  • 原文地址:https://www.cnblogs.com/moonpool/p/5472549.html
Copyright © 2011-2022 走看看