【发布时间】:2016-07-12 12:00:21
【问题描述】:
我需要一个无论有多少线程调用它都只会从后台运行一次的方法。 我找到了使用此代码的部分解决方案 我的代码:
public static void async(final int a){
Thread th = new Thread(new Runnable() {
@Override
public void run() {
meth(a);
}
});
th.start();
}
public static synchronized void meth(final int a){
try {
Thread.sleep(1000);
System.out.println(a);
} catch (InterruptedException ex) {
Logger.getLogger(Simple.class.getName()).log(Level.SEVERE, null, ex);
}
}
但是当我这样测试时:
System.out.println("start");
async(11);
async(12);
async(13);
async(14);
async(15);
async(16);
async(17);
async(18);
async(19);
System.out.println("end");
我得到了这些结果:
开始 结尾 11 19 18 17 15 16 14 13 12
我的代码有什么问题吗? 为什么结果和调用的顺序不一样?
已编辑 使用 Thread.join 后
public static Object obg = new Object();
public static void async(final int a){
Thread th = new Thread(new Runnable() {
@Override
public void run() {
meth(a);
}
});
th.start();
try {
th.join();
} catch (InterruptedException ex) {
Logger.getLogger(Simple.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static synchronized void meth(final int a){
try {
Thread.sleep(1000);
System.out.println(a);
} catch (InterruptedException ex) {
Logger.getLogger(Simple.class.getName()).log(Level.SEVERE, null, ex);
}
}
我得到了取消后台工作的结果:
开始 11 12 13 14 15 16 17 18 19 结束
Thread.join 没有给我想要的结果
第三次编辑以提供其他语言的示例。
我在 c# 中尝试了相同的代码
static void Main(string[] args)
{
Console.WriteLine("start");
async(11);
async(12);
async(13);
async(14);
async(15);
async(16);
async(17);
async(18);
Console.WriteLine("end");
}
static Object o = new Object();
public static void async(int a){
new Thread(() =>
{
lock (o)
{
Thread.Sleep(1000);
Console.WriteLine(a);
}
}).Start();
}
结果顺序相同
swift语言的测试结果和c#一样
所以我的问题是:如何在 java 中实现这些结果
编辑: 在join中使用新创建线程的结果
代码:
public static void main(String[] args) throws Exception {
System.out.println("start");
async(19,async(18,async(17,async(16,async(15,async(14,async(13,async(12,async(11,null)))))))));
System.out.println("end");
}
public static Object obg = new Object();
public static Thread async(final int a,final Thread other){
Thread th = new Thread(new Runnable() {
@Override
public void run() {
meth(a);
}
});
th.start();
try {
if(other!=null){
other.join();
}
} catch (InterruptedException ex) {
Logger.getLogger(Simple.class.getName()).log(Level.SEVERE, null, ex);
}
return th;
}
public static synchronized void meth(final int a){
try {
Thread.sleep(1000);
System.out.println(a);
} catch (InterruptedException ex) {
Logger.getLogger(Simple.class.getName()).log(Level.SEVERE, null, ex);
}
}
结果:
开始 11 12 13 14 15 16 17 18 结尾 19
后台工作也被取消了。
【问题讨论】:
-
@Idos 我尝试了网站中提供的解决方案我得到了这个结果: start 11 12 13 14 15 end ,正如你所看到的,后台没有运行任何东西。
-
使用 swift 语言测试相同的代码并给出了我的结果我希望我们能说这个问题来自 java 吗?
-
说你在 Java 中发现了一个错误是非常冒昧的,可能不是真的......
-
不是我找到的,而是结果说的
标签: java multithreading asynchronous synchronization