关于JAVA 多线程 与 反射的问题

思路就是有一个继承Thread的线程类ProxyThread,这个类接受一个Method对象 ,然后run方法中循环调用它。

测试代码是创建了一个ProxyThread的xianc对象 然后穿了一个fun方法,线程start以后fun之执行一次就结束了

Threa实现类

 package a;

import java.lang.reflect.Method;

public class ProxyThread  extends Thread{
    private boolean flag;
    private Method method;
    private Object target;
    private Object[]args;


    public ProxyThread(boolean flag, Method m, Object target,Object[]args) {
        super();
        this.flag = flag;
        this.method = m;
        this.target = target;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }


    @Override
    public void run() {

        while(flag) {
            try {

                method.invoke(target, args);
                Thread.sleep(100);

            } catch (Exception e) {
                e.printStackTrace();
            } 
         }
    }
}

调用代码


 package a;

import org.junit.Test;

public class Demo {


    @Test
    public void test() throws NoSuchMethodException, SecurityException {
        ProxyThread thread = new ProxyThread(true,this.getClass().getMethod("fun"),this,null);
        thread.start();
    }

    public void fun() {
        System.out.println("=========>");
    }
}

思路是传一个Method进去执行
可是fun为什么只执行一次?

6个回答

start这样启动的是守护线程,当主线程完成时,程序自动退出。在thread.start();后面加上 System.in.read();或者 Thread.sleep(30000);即可输出。

正常输出图片说明
加上 System.in.read(); 等待用户输入就终止
或者用 Thread.sleep(30000);等30秒.

看看是不是主线程退出了,没有执行下去

主线程挂起,异步执行,Thread.currentThread().wait();

这个是junit.Test问题,你改成 public static void main(String []argv) {
Demo demo=new Demo();
ProxyThread thread;
try {
thread = new ProxyThread(true,demo.getClass().getMethod("fun"),demo,null);
thread.start();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

} 

    执行结果 就是
    =========>

=========>
=========>
=========>
=========>
=========>
=========>
=========>无限打印了

在thread.start()后面添加thread.join(),让主线程等待子线程执行完毕后再执行。否则,主线程执行退出,子线程也就关闭了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java基础,多线程,反射
结合java最基本的多线程,反射,泛型 对java基础的学习非常有帮助
java的泛型和反射,多线程
1: java的泛型 2:java的super()在子类中使用时,必须放在第一行,还有对无参函数的调用问题。 详细的参考链接http://lavasoft.blog.51cto.com/62575/18886 3: java的反射机制(详情请参考eclipse的例子) getConstructors()构造方法getDeclaredConstructors(
关于java 反射问题
[code="java"]public static Customer setCustomerObject(String[] str)rn throws IllegalArgumentException, SecurityException,rn InstantiationException, IllegalAccessException,rn InvocationTargetException, NoSuchMethodException rnrn Class classType = new Customer().getClass();rn Field fields[] = classType.getDeclaredFields();rn Object objectCopy = classType.getConstructor(new Class[] )rn .newInstance(new Object[] );rn for (int i = 0; i < fields.length; i++) rn Field field = fields[i];rnrn String fieldName = field.getName();rn String firstLetter = fieldName.substring(0, 1).toUpperCase();rnrn // 获得和属性对应的setXXX()方法的名字rn String setMethodName = "set" + firstLetter + fieldName.substring(1);rnrn // 获得和属性对应的getXXX()方法rnrn // 获得和属性对应的setXXX()方法rn Method setMethod = classType.getMethod(setMethodName,rn new Class[] field.getType() );rn // 获得 set方法参数的类型rn Class pvec = setMethod.getParameterTypes()[0];//rncolor=red]这里得到了 类型,是否可以根据这个类型 将 str[i] 转换为 该类型? 将一个泛类型向下转化为具体的类型,然后调用 这个类型的方法rn将str[i] 转化 比如 Long.ValueOf(str[i])[/color] rn System.out.println(pvec);rn setMethod.invoke(objectCopy, str[i]);rn rn return (Customer) objectCopy;rn [/code]
浅析Java反射,多线程和网络技术
一. java 反射1.反射三个特性:运行时生成对象,运行期间调用方法,运行时更改属性。2.java在编译时并不确定是哪个类被加载了,而是在程序运行的时候才加载,探知和使用。3.反射功能:在运行时判断,调用任一个对象,类的方法和属性,常用类【Class类,Field类,Method类,Constructor类】4.反射获取类的信息:常用forName(&quot;类完整包名&quot;)Class cls = Cla...
黑马程序员——JAVA基础——多线程、反射
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 一、多线程:     1、进程和线程的区别:          进程:每个进程都有独立的代码和数据空间,进程间的切换会有较大的开 销,一个进程包含1--n个线程。     线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序 计数器(PC),线程切换开
多线程、反射
【目录】线程 实现线程 死锁 反射 注解多线程:在Java思想中,将并发完成的每一件事情称为线程。java语言提供了并发机制,程序猿可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制称为多线程。 一个简单的线程代码package com.day08.thread;public class MyThread extends Thread { @Overr
多线程及反射
01_多线程概述 进程:应用程序(可执行文件) 一个进程可以有多个线程 线程: 进程的执行路径\单元 单线程:进程只有一个可执行路径,按照步骤一步一步执行,前面的步骤没有执行完,不会执行后面的步骤 多线程:进程有多个可执行路径 例子: 洗水壶 接水 烧水
关于java的多线程问题。
下面是示例代码,不全,表示各大概的意思:rnrnMyThread my1 = new MyThread(1);rnMyThread my2 = new MyThread(2);rnMyThread my3 = new MyThread(3);rnrnmy1.start(); // 执行速度为1秒rnmy2.start(); // 执行速度为2秒rnmy3.start(); // 执行速度为3秒rnrn如上所示的多线程代码,不同参数的线程的执行速度不同,其中my3的速度是最慢的,我想知道的是:rn如何能让其他两个比他快的线程在执行完成之后不退出程序,而是等待my3执行完毕再一起退出程序?rn非常感谢。
关于java多线程的问题?
为什么我用java写的多线程服务器端程序在运行一段时间后会一下子占用很多cpu?
关于JAVA多线程问题
在VC里一个主线程开启多个子线程,当主线程结束前必须调用WATI一类的操作,如:WatiForSingleObject.这样才能确保所有子线程结束后再结束主线程。而JAVA多线程却只调用了一个start方法开启一个线程后,并没有任何等待的操作。他是如何保证主线程在所有子线程结束后再结束的?
关于Java的多线程的问题
CPU在一个时间点上只会运行一个线程,为什么还会出现两条线程占用同资源?
关于java多线程的问题
public class TestThread rnrn /**rn * @param argsrn */rn public static void main(String[] args) rn // TODO Auto-generated method stubrn MyThread t1 = new MyThread();rn new Thread(t1,"n1").start();rn new Thread(t1,"n2").start();rn rnrnrnrnclass MyThread implements Runnable rn private int tickes =100;rn @Overridern public void run() rn // TODO Auto-generated method stubrn while(tickes>0)rn synchronized(this) rn //if(tickes>0) rn System.out.println(Thread.currentThread().getName() + " sell tickes " + tickes);rn tickes--;rn //rn rn rn rn rn rn rnrnrnrn以上代码是一个简单的模拟售票程序 ,但是我不明白为何运行时会出现买到第0张票的情况rn 请各位大侠解释下 万分感激!!n[b]问题补充:[/b]n但是在 synchronized(this) 后别的线程不是就应该无法访问this对象了吗rnn[b]问题补充:[/b]n哦 知道啦 是我理解错啦 我还以为只要已锁定 不管在哪都不能访问了 谢谢哦 rn
关于java多线程问题
关于java多线程问题rn1、rn在一个线程中等待一个队列返回结果值,是否可以在该线程中设置结果值并放入队列,从而使得等待的地方继续执行?rnrn2、rn是否可以给线程执行设置顺序?rn3、rnrn事件通知与队列、线程间如何交互?rnrn谢谢。
关于JAVA多线程的问题
JAVA多线程一般应用于哪些场景,比如做一个电商网站,可以将此技术运用在哪部分功能呢?或者能贴出部分代码也可以!
关于java 多线程的问题
大家看一下在这个线程中最后的exception的处理中的return;是怎么一回事啊rnrnpublic void run() rn rn System.out.println( "Node "+number + " has been started" ); rn try rn rn while (got < message.length) // message incomplete rn rn while (empty()) Thread.sleep(100); // wait until receive is called rn Thread.sleep(4000); rnrn message[store.getPartNumber()-1] = store; rn got++; rn store = null; rn rn rn catch (InterruptedException e) rn rn System.err.println( "Node " + number + " has been stopped" ); rn [color=#FF0000]return;[/color]
关于Java多线程的问题
多个线程执行相同的代码,共享票数这个变量,但是我对其中的打印语句有些疑问,先上代码吧:rn[code=java]rnpublic class test rnrn /**rn * @param argsrn */rn public static void main(String[] args) rn // TODO Auto-generated method stubrn MyRunnable mt = new MyRunnable();rn Thread mt1= new Thread(mt, "一号窗口"); rn Thread mt2= new Thread(mt, "二号窗口"); rn Thread mt3= new Thread(mt, "三号窗口"); rn mt1.start(); rn mt2.start(); rn mt3.start(); rn rn rnrnrnclass MyRunnable implements Runnable rn rn private int ticket = 10; rn rn public void run() rn for(int i =0;i<500;i++) rn if(this.ticket>0) rn System.out.println(Thread.currentThread().getName() +"卖票---->"+(this.ticket--)); rn rn rn rn rn[/code]rnrn输出结果:rn[code=java]rn一号窗口卖票---->10rn一号窗口卖票---->8rn一号窗口卖票---->7rn一号窗口卖票---->6rn一号窗口卖票---->5rn一号窗口卖票---->4rn一号窗口卖票---->3rn一号窗口卖票---->2rn一号窗口卖票---->1rn二号窗口卖票---->9rn[/code]rnrn从结果上看,第9张票是二号窗口卖出去的,这时候二号窗口的线程应该获得了时间片,但却没有立即打印输出,却在最后打印出来,这是问什么呢?知道的朋友帮帮忙吧,先谢了。
关于java反射,属性问题
经过反射得到的属性名是一个完整的路径,我怎么得到的只是一个属性名呢。
关于JAVA反射类的问题~!
小弟初学JAVA反射类机制,看了一些牛人的文章,但是看不太懂啊~!哪位高手帮忙解释一下啊~!~rnrn=====================================rn#001 public finalrnrn#002 class Class implements java.io.Serializable,rnrn#003 java.lang.reflect.GenericDeclaration,rnrn#004 java.lang.reflect.Type,rnrn#005 java.lang.reflect.AnnotatedElement rnrn#006 private Class() rnrn#007 public String toString() rnrn#008 return ( isInterface() ? "interface " :rnrn#009 (isPrimitive() ? "" : "class "))rnrn#010 + getName();rnrn#011 rnrn...rnrn=========================================rnrnpackage java.util; //(1)rnrnimport java.lang.*; //(2)rnrnpublic class LinkedList //(3)(4)(5)rnrnextends AbstractSequentialList //(6)rnrnimplements List, Queue,rnrnCloneable, java.io.Serializable //(7)rnrnrnrnprivate static class Entry … //(8)rnrnpublic LinkedList() … //(9)rnrnpublic LinkedList(Collection c) … rnrnpublic E getFirst() … //(10)rnrnpublic E getLast() … rnrnprivate transient Entry header = …; //(11)rnrnprivate transient int size = 0;rnrnrnrnrnrn高手帮忙看看这两段代码是什么意思?
关于JAVA反射编程的问题!~
public Object getActionFormModelValues(ActionForm form) throws Exceptionrnrnrnrnform是我传过来的一个form=>UserForm ,,它继承了ActionFormrnrn这个时候form是有值的,假设form里面有3个字段分别是 id,name,pws。但是我要通过一种什么方法把里面的值给弄出来?rnrnrn我试过用Class cls=form.getClass();rn但是这样得到的是一个没有被实例化的Class对象返回的也就是ActionForm这个对象,而且还是空的rnrnrn当然我也可以用这样的方式rnpublic Object getActionFormModelValues(Object form) throws Exceptionrnrnrnrnrn只要有办法取到值,但是又不要管传过来的是什么对象,只要这个对象继承了ActionForm就行的。。。我应该怎么取值rn
关于JAVA反射实现的问题
JAVA的反射封装可以查看类的方法,不知是怎么实现的?怎么可以看到实现其功能的源代码?
关于java反射报错问题
写了这么多次反射今天遇到这个问题就头痛,nClass c=Class.forName("edu.fzu.amoslee.bean.BeanInfo");n我刚写这一行代码就出错。nThe type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class filesn但是如果是Class.forName("edu.fzu.amoslee.bean.BeanInfo");这样就没问题,请问这是什么问题
java初学关于反射问题
关于下列程序中有2行不会理解,麻烦详细讲解一下。即getMethod和invoke的用法和参数类型的讲解。谢谢!rn[code=Java]rnpackage com.softeem.book.clz;rnimport java.lang.reflect.Method;rnpublic class ReflectInvoke rn public int add(int a,int b)rn return a+b;rn rn public static void main(String[] args)rn tryrn Class cls=Class.forName("com.softeem.book.clz.ReflectInvoke");rn Class[] types=new Class[2];rn types[0]=Integer.TYPE;rn types[1]=Integer.TYPE;rn Method meth=cls.getMethod("add", types);//这一行怎么理解?rn ReflectInvoke obj1=new ReflectInvoke();rn Object[] list=new Object[2];rn list[0]=new Integer(37);rn list[1]=new Integer(47);rn Object retobj=meth.invoke(obj1, list);// 这一行该怎么理解?rn Integer retval=(Integer)retobj;rn System.out.println(retval.intValue());rn catch(Throwable e)rn System.err.println(e);rn rn rnrnrnrn[/code]
java反射 java反射 java反射java反射
java反射 java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射
关于Class和java的反射
class的意义:作为程序运作过程中用于标识和维护某个类运行时候的状态,可以通过反射来获取到相应的对象属性。这个Class和我们常见的class还是有所区别的,前者更多的是保存运行时的类信息,后者则只是一个关键字而已。 通过class我们最常用的就是反射技巧,可以借助反射来获取类里面我们所需要的变量,方法,构造函数等信息,同时我们还可以借助反射来进行类的实例化操作。 接下来我们闲话不多说,直接写一...
关于JAVA反射
项目中有个需求需要实现指定属性的名称取出属性值,回忆了一下记得springside里边有个工具类直接就能侵犯对象隐私。。。嘿嘿 翻出来留念,yeah~茄子! [code=&quot;java&quot;] package org.springside.modules.utils; import java.lang.reflect.Field; import org.slf4j.Logger; im...
关于JAVA反射使用
小弟在使用Java的反射机制时遇到了一些问题。希望得到大家的帮助。rnrn有两个类一个叫rnSymbolBase里面有doPaser方法。rn一个SymbolC1继承SymbolBase类,实现自己的一些方法。rnrn而在另一个执行类中。Base类中我在定义的时候定义SymbolBase但是在实例的时候采用SymbolC1。由于有很多个SymbolCX所以需要使用反射根据名称进行实例。rnrn[code=Java]rnpackage co.com.comm;rnrnpublic class Base rnrn private SymbolBase symbol = null;rn rn public Base()rn rn symbol = new SymbolC1("String");rn symbol.doPaser();rn ((SymbolC1) symbol).getSymbolStr();rn rn rn rn public static void main(String[] args)rn Base base = new Base();rn rnrnrnpackage co.com.comm;rnrnpublic class SymbolC1 extends SymbolBasernrn public SymbolC1(String strVal) rn super(strVal);rn // TODO 自動生成されたコンストラクター・スタブrn rnrn public void getSymbolStr()rn System.out.print("SymbolC1 getString!");rn rnrnrnpackage co.com.comm;rnrnpublic class SymbolBase rn private String strname = "";rn public SymbolBase(String strVal)rn this.strname = strVal;rn rn rn public void doPaser()rn System.out.println("Base Paser!");rn rnrnrn[/code]rnrn我的问题是,我想在Base中通过Class.forName来自动根据一个字符串实例化相应的SymbolCX。即SymbolC1,SymbolC2,而且像上面那样使用。rn我能想到的是使用Java的反射机制但是具体应该如何实现。看了很多反射实例也没找到方法。rn希望高手给予解决,小弟在此谢过。rn
关于Java反射笔记
原文:https://www.jianshu.com/p/5b3acad0f025 什么是反射: Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;