我在使用两个线程的Java应用程序中遇到了一个非常奇怪的死锁.两个线程都将数据读写到共享散列映射.为了避免同步问题,我使得同步读取和写入数据的函数的hashmap:
private synchronized boolean identifiedLinksHasKey(String linkKey){
return Parser.identifiedLinks.containsKey(linkKey);
}
private synchronized void putToIdentifiedLinks(String key, TreeSet<String> aset){
Parser.identifiedLinks.put(key,aset);
}
Run Code Online (Sandbox Code Playgroud)
但是,程序在某些时候会挂起(当我使用单个线程运行它时不会发生这种情况).为了调试我的应用程序,我在挂起后使用了jstack,这给了我以下的线程转储:
"thread-2"prio = 6 tid = 0x0000000006b09800 nid = 0x78fc runnable [0x00000000083ef000]
java.lang.Thread.State:在bgp.parser.Entry的java.util.HashMap.put(未知来源)中的RUNNABLE.putToIdentifiedLinks(Entry.java:297) - 在bgp.parser.Entry.run的bgp.parser.Entry.parseTxtFile(Entry.java:141)中锁定<0x00000000853f2020>(bgp.parser.Entry)(Entry.java:31 )"Thread-1"prio = 6 tid = 0x0000000006b52800 nid = 0x9390 runnable [0x00000000082ef000]
java.lang.Thread.State:java.util.HashMap.containsKey(未知来源)java.util.HashMap.getEntry(未知来源)的RUNNABLE )在bgp.parser.Entry.identifiedLinksHasKey(Entry.java:281) -在bgp.parser.Entry.parseTxtFile(Entry.java:134)在bgp.parser.Entry.run(Entry.java:31锁定<0x00000000853f00e0>(一个bgp.parser.Entry) )
它接缝两个线程同时访问两个同步函数,这与同步的含义相矛盾.即使我使用对象锁,也会发生相同的情况.虽然线程的状态不是BLOCKED但是RUNNABLE它们表现为阻塞,可能是因为它们同时访问同一个hashmap.
如果有人能解释我为什么会发生这种奇怪的情况,我真的很感激.
我在TCL编程方面相当新,通过基础知识我遇到了以下代码片段:
set x 0;
while "$x < 3" {
set x [expr $x + 1]
if {$x >6} break;
if "$x > 2" continue;
puts "x is $x";
}
puts "exited second loop with X equal to $x\n"
Run Code Online (Sandbox Code Playgroud)
执行时,结果如下:
x是1
x是2个
退出的第二个循环,X等于7
令我惊讶的是,当执行continue命令时,似乎没有评估while循环测试(x <3).但是在tcl联机帮助页中声明" 正文中的continue语句将停止代码的执行,并且将重新评估测试. "
我错过了什么?
是否可以在Python for循环中操作索引指针?
例如在PHP中,将打印以下示例1 3:
$test = array(1,2,3,4);
for ($i=0; $i < sizeof($test); $i++){
print $test[$i].' ';
$i++;
}
Run Code Online (Sandbox Code Playgroud)
但是在Python中,当我尝试增加索引时没有任何效果.例如,以下将打印所有数字:
test = ['1', '2', '3', '4']
for i in xrange(len(test)):
print test[i]
i=i+1
Run Code Online (Sandbox Code Playgroud)
有没有办法在循环内操作for循环指针,这样我就可以实现一些复杂的逻辑(例如,返回2步然后转发3)?我知道可能有其他方法来实现我的算法(这就是我现在所做的),但我想知道Python是否提供了这种能力.
我是 Qt 的新手,我想实现一个可以动态增长的可滚动小部件,例如,在按下另一个按钮时向其中添加按钮。我尝试使用以下布局和代码来实现它:

scrollArea = new QScrollArea(ui->outerWidget);
scrollArea->setWidget(ui->innerWidget);
layout = new QVBoxLayout(ui->outerWidget);
ui->innerWidget->setLayout(layout);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// code for PushButton to add buttons in innerWidget
void MainWindow::on_pushButton_clicked()
{
QPushButton *button = new QPushButton("button"+QString::number( nameCounter ));
nameCounter ++;
ui->innerWidget->layout()->addWidget(button);
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,此实现有两个问题,首先,innerWidget 出现不合适(我在 Qt Creator 的设计模式中定义其位置),其次在布局中添加许多小部件后,滚动条不会增长,而是相反小部件变得更小以适应布局:

在另一个线程中,建议将 widgetResizable 设置为 true:
scrollArea->setWidgetResizable(true);
Run Code Online (Sandbox Code Playgroud)
滚动条现在似乎可以工作,但新的问题是innerWidget变得非常小,因此几乎不可见:

那么,如何实现一个符合设计大小和位置的可滚动小部件呢?
当我尝试使用服务器的实际主机名连接到MySql数据库时,我收到以下消息:
mysql_connect():第8行/home/[username]/sendtitles.php中的用户'user'@'ip -...-.internal'(使用密码:YES)拒绝访问
也就是说,
$conn = mysql_connect("localhost",$user,$password); //WORKS!
$conn = mysql_connect($actual_hostname ,$user,$password); //Doesn't work :(
Run Code Online (Sandbox Code Playgroud)
我很感激你帮助我理解为什么会这样.
我有一个包含大约500K作业的表,每个作业都有一个唯一的ID用作主键,状态用于指示作业是挂起,完成还是失败.状态是一个非关键的整数.
我的问题是,我尝试根据状态选择作业的简单查询需要花费太多时间,超过10分钟.在DB中连接了大约46个线程,我也重新启动但它没有帮助性能.
我粘贴了表模式和我尝试在此运行的查询:http: //pastie.org/10416054
有没有办法找到瓶颈和优化表,所以它不需要那么长时间?