首页新闻找找看学习计划

java多线程问题

0
[已解决问题] 解决于 2017-09-17 18:59

假设有2个线程1,2;

线程1请求正在占用锁,另一个线程2无法占用锁,请问如何对线程2进行处理?

我的思路是:对线程2设置一个请求超时时间,如果在规定时间内还未能访问锁,则释放掉该线程.

请问有什么其他的更好的思路?最好能给出代码示例,多谢!

OSManager的主页 OSManager | 初学一级 | 园豆:9
提问于:2017-09-14 11:39
< >
分享
最佳答案
0

你看下API文档Object类的wait方法

奖励园豆:5
曾有满腹理想的阿飞 | 菜鸟二级 |园豆:224 | 2017-09-14 16:47
package test;


public class test1
{
    static String aaw = "";
    public static void main(String[] args)
    {
        new A().start();
        new B().start();
    }
}

class A extends Thread
{
    @Override
    public void run()
    {
        // TODO Auto-generated method stub
        synchronized (test1.aaw)
        {
            try
            {

                for (int i = 0; i < 100; i++)
                {
                    test1.aaw.wait(10);
                    System.out.println("a" + i);
                }
            } catch (Exception e1)
            {
                // TODO Auto-generated catch block
                
            }
            
        }
    }
}

class B extends Thread
{
    @Override
    public void run()
    {
        // TODO Auto-generated method stub
        synchronized (test1.aaw)
        {
            try
            {
                for (int i = 0; i < 100; i++)
                {
                    test1.aaw.wait(10);
                    System.out.println("b" + i);
                }
            } catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
曾有满腹理想的阿飞 | 园豆:224 (菜鸟二级) | 2017-09-14 17:41

@曾有满腹理想的阿飞: 您可能误解我说的意思了,比方说我有1000次线程请求过来,但是只有一次请求是可以有效执行同步代码的,你所说的wait()方法,应该是那次有效请求在同步代码过程中调用可以停止该线程占用锁资源,但是现在的问题是我希望那999次无效的请求不会返回响应给用户;现在是想处理那999次无效的请求

OSManager | 园豆:9 (初学一级) | 2017-09-16 16:48

@OSManager: 我重新写了代码,不知道是不是你想要的。就是线程加个计时器,如果超时就return,也就相当于是释放线程吧。

package test;


public class test1
{
    static String lock = "";//
    static boolean is_overtime;// 时候超时
    
    static class A extends Thread
    {
        @Override
        public void run()
        {
            new Thread(new Runnable()
            {
                public void run()
                {
                    try
                    {
                        Thread.sleep(5000);// 相当于计时器
                        is_overtime = true;
                    } catch (InterruptedException e)
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                }
            }).start();
            // TODO Auto-generated method stub
            while (true)
                if (is_overtime) return;
                else synchronized (lock)
                {
                    System.out.println("a");
                    break;
                }
        }
    }
}
曾有满腹理想的阿飞 | 园豆:224 (菜鸟二级) | 2017-09-16 20:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册