问题是这样的。 我现了一个线程,但是run函数里就调用了一个 别的函数。
例如public void run() {
    XXXClass.longTimeExecute();
}而这个函数会花上点时间, 问题我想做2个功能,一个就是让这个函数暂停 一个是挂起。
另外这个函数的源代码是不能改的。
所以不能像一下参考贴里的那样,自己加wait或者Thread.sleep。
可行吗?
参考贴

解决方案 »

  1.   

    CGLib生成代理来实现,楼主可行否
      

  2.   

    看起来只能用suspend和resume了。
      

  3.   


    1.你这个函数如果不是线程的话,怎莫让函数暂停呢?
    再说了,暂停是针对整个线程而言的,不是针对方法而言2.退一步说,即便真的要挂起线程
    楼上的各位也说了用 suspend
    建议这个方法不要用,会造成线程的死锁,现在这个方法已经成为Thread类里不推荐使用方法了所以,要解决楼主的需求
    大概只能是暂时执行这个方法的线程,或者设为后台线程
    而不是让方法暂停
      

  4.   

    不知你的意思是否是这样,比如这个函数需要10秒,这个线程执行了5秒时间,完后你把线程挂起或暂停,希望这个函数也随之挂起和暂停,等线程被notify后,函数再执行剩下的5秒?这是不行的,因为线程一旦一开始调用这个函数,这个函数的执行过程是不会随着线程的挂起或暂停而挂起或暂停的,这个函数一旦开始执行,就不会停止
      

  5.   

    除非XXXClass.longTimeExecute();也是用线程在做,否则怎么让它停?
      

  6.   

    暂停的只能是线程,而不是函数,所以,楼主设想的让一个函数执行一部分时间后暂停,过一段时间再继续,那是行不通的。如果楼主一定做这样的事情,那么只能改写函数,在你需要暂停的地方,加上Thread.sleep()语句来使执行该函数的线程暂停一段时间。但是,这样的做法只能让线程暂停固定的一段时间,而不能根据需要来暂停和挂起线程,如果你希望控制线程的动作,那就需要使用wait和notify方法。
      

  7.   

    加上Thread.sleep()语句来使执行该函数的线程暂停一段时间?让执行该函数的线程暂停有什么用?一旦执行该函数的线程启动,函数根本就不会因为那个线程的暂停而暂停,应该是如果这个函数里执行了另一个线程,那可以通过挂起或暂停那个函数里的线程使得函数暂停,但楼主又说函数的源代码不能改,所以楼主的要求是达不到的
      

  8.   

    哎 这个需求很麻烦了
    你想让run函数里面的函数暂停 除非它里面有线程 不然你是不能停掉里面的函数的
    一旦夯实在线程合法是被调用了 他就会一直执行下去(就是普通函数) 虽然CPU不可能一口气
    运行玩 但CPU迟早到要运行玩 
    就概念来函数不同于线程 是无法暂停的
      

  9.   

    让里面的线程挂起?? interrupt() 终端线程行吗?
      

  10.   


    那你弄错了。Java语言中执行的主体是线程(实际上所有的面向对象多线程程序都是这样的),函数(方法)是静态的,而且都是成员函数,只有它被所属的对象调用所调用才可能被执行,哪个线程执行了调用语句,该函数的执行过程就从属于该线程的执行。而线程一旦暂停或者终止,则函数的执行也随之暂停或者终止。在Java多线程程序设计中,被执行的总是线程,或者是主线程(main函数的执行),或者是自定义线程(使用Thtread类创建的),函数是一个静态的东西,它只能被某个线程所执行,不可能自己执行。我想引起你误解的地方大概是:你所考虑的函数被调用是在main函数中的,那它的执行当然和其他用户创建的线程无关了,但是,它实际上是从属于主线程的,你同样可以在该函数中加上Thread.sleep()语句,此时,当主线程调用该函数时,执行到Thread.sleep()语句,主线程同样会暂停。
      

  11.   

    已经是异步了,时间长又有何关系。如果觉得对资源影响大了,对thread设置一下优先级就可以了,
      

  12.   

    还不是很明白楼主
    知道是不是这样class Person
    {
    // 两种情况
    private String name = "AAAA" ;
    private String content = "作者" ;

    public synchronized void setName(String name,String content)
    {
    this.name=name;
    try{
    Thread.sleep(100);

    }catch(Exception e)
    {
    }
    this.content=content;
    }  
    public synchronized String getName()
    {

    return this.name+" --> "+this.content;
    }
    };
    class Pro implements Runnable
    {
    private Person per = null ;
    public Pro(Person per)
    {
    this.per = per ;
    }
    public void run()
    {
    for(int i=0;i<100;i++)
    {

    if(i%2==0)
    {
    per.setName( "BBBBB","老板") ;

    }
    else
    {
    per.setName( "AAAA","作者") ;

    }
    }
    }
    };class Cust implements Runnable
    {
    private Person per = null ;
    public Cust(Person per)
    {
    this.per = per ;
    }
    public void run()
    {

    for(int i=0;i<100;i++)
    {

    System.out.println(per.getName()) ;
    }
    }
    };public class ThreadDemo19
    {
    public static void main(String args[])
    {
    Person per = new Person() ;
    Pro p = new Pro(per)  ;
    Cust c = new Cust(per) ; new Thread(p).start() ;
    new Thread(c).start() ;
    }
    };
      

  13.   

    搞了半天你这里的线程是指主线程,我们一直都说的不是一个线程,我说的是执行那个run方法的线程,争了半天白争了
      

  14.   

    39多个贴子,只有一个人,24楼的人真正懂JAVA线程。这么基础的问题,竟然一大堆人都在胡说,可悲!
      

  15.   

    这个问题我拿给实习生做,7个人中有4个人答对。而CSDN竟然只有一个人懂,到底是怎么了。
    国内现在两种人才在贬值。
    1是驾驶员,以前我们学习驾驶一年才能拿到本,现在15天就拿到了,结果路上一大批马路杀手。
    2是程度员,以前100个高中生只出5个本科学,5个本科生中0.2个是做计算机,0.08个是定程序的,现在100
    个高中生,70上本科生,20个专科生。70个本科生中40个做计算机的,15个写程序的。结果就是39个回贴中30个以上在胡说。
    不要骂我说话刻薄,认真想一想这是不是事实。
      

  16.   

    不明白楼主的意思。
    挂起,一般都是指线程的挂起,没听说过函数能挂起的。
    这里面有一个问题,需要区别一下。就是,函数可以被多个线程来执行。
    所以,楼主说的挂起函数,应该是指挂起执行函数的线程。
    如果是多个线程都要执行这个函数,那么,是挂起所有调用这个函数的线程,
    还是只挂起第一个调用该函数的线程 ?暂停,这个词,貌似没有在编程里面接触过,最早是在使用磁带录音机的时候接触到的。
    线程的状态里面,好像和暂停最贴近的,应该就是挂起状态,其次是阻塞状态吧。楼主说的2个功能(暂停、挂起),想了很久,也没想清楚到底是什么意思。如果我们想中断某个函数的执行过程,可以通过挂起调用该函数的线程的方式来进行。
    (多线程调用同一函数时,情况可能会非常恶劣)
    当然,在程序中想要挂起某个线程,最好是new一个Monitor线程来完成这件事情,
    当然,异步操作某个函数的执行进度,会使程序具有不可控性,严重的情况下,会产生死锁。
      

  17.   


    不知道你是如何理解的?我前面明明一再强调,函数不是执行的主体,线程才是执行的主体,Java程序中可能有很多线程在运行,其中一个是主线程,就是执行main函数的线程,其余的是程序中使用Thread类创建的线程(其实严格地说,还有我们看不到也不必关心的系统自定义的后台线程)。我说的“线程是执行的主体”指是任意线程,不论主线程还是自定义线程。
      

  18.   

    看完参考贴,我明白了楼主的意思了,这里没有线程的事,只有函数的事,他的意思是说在不修改longTimeExecute();这个函数前提下,增加它的执行时间,我们把这个函数权当一个黑盒子吧。那么只有两个时机可以利用:before与after。而技术也是相当多的,但原理只有一个,那就是利用钩子原理,进行切面编程,可以参考AspectJ.
      

  19.   

    能挂起的是线程,不是函数你的线程一旦挂起,函数的运行就会暂停了你想挂起直接把此线程调用wait吧
      

  20.   

    再次看到白痴在增加。一个函数放在线程中运行,只要控制线程本身当然就控制了那个函数的执行了。
    这么简单的问题竟然有这么多白痴在不懂装懂。还什么代理什么拦截。一个函数a(){
      s1;
      s2;
      ................
      sn;
    }放在一个线程的run方法中,假如线和叫t,t.start()后。
    假如执行到 s9,你调用t.sleep();
    当然是停止执行这个函数了。你想控制函数本身也没法控制,而正好你要的就是不修改函数本身,你只要控制
    那个run 方法所在的线程。这种问题对程序员来说就是幼儿园小班的问题,竟然有这么多不懂装懂的在故作高深。
      

  21.   

    给你个线程资料  http://www.java1995.cn/wiki/topic/6
      

  22.   

    真的没有其他办法了吗
    Java这么强大的
      

  23.   

    package Thread;public class TwoThread {
    public static void main(String[] args) {
    Queue q=new Queue ();//new出一个q:后面的两个线程都是用的同一个q,保证一个put一个get
    Producer p=new Producer (q);//让new出的p去往q里面put
    Customer c=new Customer (q);//让new出的c从q中get
    p.start();//p和q开始的顺序并不报错
    c.start();

    }
    }
    class Producer extends Thread
    {
    Queue q;
    public Producer(Queue q) {
    this.q=q;//给成员变量赋值,再一调运q的put方法
    }
    @Override
    public void run() {
    for (int i = 0; i < 10; i++) {
    q.put(i);//此处只是让q去put  10次
    System.out.println("Producer put "+i);//并且输出本次放的是第几杯
    }
    }
    }
    class Customer extends Thread
    {
    Queue q;
    public Customer(Queue q) {
    this.q=q;//给成员变量赋值,再一调运q的get方法
    }
    @Override
    public void run() {
    while (true) {//死循环:只要q里面有,就去get
    //get方法有返回值,返回值就是producer所put的数量
    //此处也不需要去考虑是第几杯
    //在Queue中的value解决可这一问题:
    //put中的I赋给value,get方法有返回值就value的值
    System.out.println("Customer get "+q.get());
    //如果循环完了,就跳出循环,否则线程不会自己结束
    if (q.value==9) {
    break;
    }
    }

    }
    }
    class Queue
    {
    int value;
    boolean bFull=false;
    public synchronized void put (int i)//在producer中的put方法中就是将其I传进来
    {
    if (!bFull) {//条件为真(如果没满,就倒水)
    value=i;//给value赋值,现在有几杯水
    bFull=true;//满了
    notify();//唤醒其他线程(让customer去get)
    }
    try {
    wait();//告诉customer去get后自己等待customer的get结束
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public synchronized int get()
    {
    if (!bFull) {//如果没满就等待,如果满了就不进    **这就是为什么main里面谁先开始不报错的原因**
    //get和put方法中的if条件判断起到了至关重要的作用
    try {
    wait();
    } catch (InterruptedException e) {

    e.printStackTrace();
    }
    }
    bFull =false;//赋值为没满
    notify();//唤醒producer去put
    return value;//get的返回值就是put的时候给value赋的值
    }
    }
      

  24.   

    如果学过一天计算机原理,也不会产生这么多BC
    程序是什么,就是一段表示要执行的逻辑。
    线程是什么?就是进程中细化的轻量级进程,对于讨论这个问题本身,我们可以把线程当做进程看。管你什么函数,循环还是流线性逻辑,都是要CPU按这个逻辑执行的指令流。
    要控制什么进修执行哪一个指令当然是控制当遇到什么指令时当前执行这段指令流的进程。一个函数执行后不会因为线程挂起或暂住而挂起或暂停?这种话会把你的任课老师气死的。
    连1+1都没弄懂,还学什么编程?让函数执行的是谁,函数在哪里执行的?执行函数的线程都停了,竟然说函数不会停。函数
    在你的梦里执行的啊?我们进程(线程在本主题中可以认为相同)运行好比飞机飞行,我们乘客就是这次飞行的函数。
    要控制人停下来怎么办?当然是控制某种条件下飞机停下来。难道飞机停下来你还在飞?上面有兄弟说“某人说话虽然刻薄,但............”.
    是的我说得有些刻薄,但这是最最基础的1+1都不明白,还故作高深讨论别的。我这叫刻薄吗?
    我这叫愤怒!