小编jlh*_*jlh的帖子

简单的Java示例运行14个线程.为什么?

以下简单的Java代码:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Start");
        Thread.sleep(5000);
        System.out.println("Done");
    }
}
Run Code Online (Sandbox Code Playgroud)

运行使用14个线程.我知道有些GC线程在后台运行,但其他的是什么?为什么有那么多线程?我在Java 1.6.0_26上使用Gentoo Linux.使用Eclipse的编译器或javac进行编译并没有什么区别(在Eclipse中以调试模式运行它会增加3个线程,但这可能是合理的).

java multithreading

13
推荐指数
3
解决办法
5828
查看次数

Java wait()/ join():为什么这不会死锁?

给出以下Java代码:

public class Test {

    static private class MyThread extends Thread {
        private boolean mustShutdown = false;

        @Override
        public synchronized void run() {
            // loop and do nothing, just wait until we must shut down
            while (!mustShutdown) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    System.out.println("Exception on wait()");
                }
            }
        }

        public synchronized void shutdown() throws InterruptedException {
            // set flag for termination, notify the thread and wait for it to die
            mustShutdown = true;
            notify();
            join(); // lock …
Run Code Online (Sandbox Code Playgroud)

java multithreading join notify wait

9
推荐指数
1
解决办法
1830
查看次数

Django模板和空白

我开始在我的django模板中使用自定义包含标记.例如,我有一个{% profilelink profile %}标签,用于插入用户配置文件的链接以及配置文件图片的小版本,如下所示(profilelink.html):

<a href='{% url ... %}'><img src='{{ ... }}' alt='...'> {{ profile.name }}</a>
Run Code Online (Sandbox Code Playgroud)

但是,当我在以下代码段(sometemplate.html)中使用它时:

<p>Owned by {% profilelink owner %} (uploaded by {% profilelink uploader %})</p>
Run Code Online (Sandbox Code Playgroud)

然后我在第二个模板标签生成的HTML和右括号之间得到空格. 这个空白是不受欢迎的.它来自profilelink.html文件中的最终换行符.这是一个非常常见的问题,搜索Stackoverflow会产生很多关于模板中空格的问题.以下是迄今为止发现的解决方案的摘要以及它们不起作用的原因:

其中一些问题可以通过{% spaceless %}标签解决,但不是所有问题都可以解决.此标记仅删除标记之间的空格,而上例中的情况并非如此.

一种可能的解决方案是在profilelink.html中没有最终的EOL,但这是非常不受欢迎的.理由:风格一般不好; 一些编辑器(vim)默认默默地添加一个; 这就是POSIX定义一条线的方式 ; 它可能会使一些SCM不满意; 等等

另一种解决方案是切换到另一个模板引擎,如Jinja2,它可能会也可能不会解决这个问题.它支持{% ... -%}使用下一个EOL角色的构造.这在某些情况下很有用,但对我上面的例子也没用.但是,为了这么小的烦恼而切换模板后端似乎有点矫枉过正,并增加了另一种依赖性.我想坚持任何标准的"django"做事方式.显然,有计划将Jinja2作为新的Django默认值.

有些人建议使用中间件类从生成的HTML中删除多余的空格,然后再将其发送到浏览器.这很有用,但仅用于以功能相同的方式转换HTML,即相同的语义:它仍然会在浏览器中以相同的方式显示.这不是我想要的,我希望在语义上进行实际的改变,以使其正确显示.这在通用中间件类中是不可能实现的.我需要在模板本身内逐个控制这个.我不关心让HTML更漂亮,我首先关心它是正确的.

还有一个错误#2594已被关闭为WONTFIX与参数(引用)"Django模板语言足以生成HTML,它对空白不敏感".在我的观点中,这是完全错误的.HTML对空白非常敏感,它并不关心它有多少.它关心是否有一些空白或根本没有空白.

我的一些问题是:是否有任何理智的方法来解决这个问题?(总是有效的,不仅仅是在某些情况下.)

(任何基于CSS的修复都不算数.复制/粘贴意外是邪恶的.)

python django django-templates

7
推荐指数
1
解决办法
1916
查看次数

boost :: asio :: tcp :: socket关闭并取消,不调用处理程序

我正在用boost的asio库编写一个服务器.服务器使用一组Connection对象(boost :: asio :: tcp :: socket周围的包装类)处理许多并发连接.在Connection类中,不断地使用socket.async_read_some(...)读取套接字,并且每当使用新数据调用读取处理程序时,立即再次调用socket.async_read_some()以读取更多数据.

现在,服务器可能由于某种原因决定断开客户端,因此自然要做的就是调用connection.close(),然后调用socket.close(),这将导致所有挂起的异步操作被取消.这会导致使用boost :: asio :: error :: operation_aborted调用读处理程序(绑定到类Connection中的方法).而我的问题是:我不希望这种情况发生.

在socket.close()之后,我想销毁套接字和连接,然后从服务器的活动客户端列表中删除它的指针.但是,在io_service.run()的下一次迭代之前不会调用读取处理程序,这意味着我无法立即销毁我已经传递给socket.async_read_some()的套接字或读取处理程序,直到调用处理程序与错误.所以我不得不以某种方式推迟对这些物体的破坏; 这太烦人了.

是否有安全的方法

  • 取消挂起的异步操作,不需要调用任何处理程序,所以我可以在socket.close()之后立即安全地销毁套接字,或者
  • 安全地知道什么时候不能再调用处理程序

还是我完全以错误的方式接近这个?

c++ boost boost-asio

6
推荐指数
1
解决办法
3383
查看次数