java多线程编程之四(interrupted和isInterrupted区别)

java多线程编程之三(interrupted和isInterrupted区别)

在java的线程Thread类中有三个方法,比较容易混淆,在这里解释一下 (1)interrupt:置线程的中断状态 (2)isInterrupted:线程是否中断 (3)interrupted:返回线程的上次的中断状态,并清除中断状态,静态方法

interrupted()

    public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }

isInterrupted()

    public boolean isInterrupted() {
        return isInterrupted(false);
    }

为什么interrupt,isInterrupted是实例方法,而interrupted是类方法

摘抄网上的解释:

interrupt的语义 是:中断一个线程。线程可以在其内部调用this.interrupt()来中断自己,但是如果自己遇到阻塞或睡眠了,怎么办呢?所以,就需要从另外一个外部线程上将其中断,即在Thread1上调用Thread2.interrupt() 来中断thread2。

同时,thread1有时候也想去看看其他线程(thread2)目前的状态是怎样的,所以在Thread1上调用Thread2.isInterrupted()就可以检查thread2的中断状态。

但是,thread2的中断状态是它自己的内部属性,你thread1要看一下无所谓,但你想来改,就不对了;

因为如果你要来改,我thread2是不知道的,我就不能通过中断状态的查询来做一些事件了,所以还是让我自己来改吧,所以我就要用类方法interrupted来实现这个功能!这样的话,也能够保证只有在当前线程运行的时候,才去调用interrupted,如果当前线程不在运行,那么调用interrupted又有什么意义呢?(因为interrupted会改变当前线程的中断状态,如果你都不在运行,又何来中断不中断一说???)

源码解析

下载地址:http://openjdk.java.net/groups/hotspot/

java多线程编程之二(currentThread)

currentThread方法

代码CountOperate:

package thread.currentThread;

public class CountOperate extends Thread{
  public CountOperate(){
    System.out.println("countOperate Thread.currentThread().getName()====" + Thread.currentThread().getName());
    System.out.println("countOperate getName()=====" + this.getName());
  }
  
  @Override
  public void run(){
    System.out.println("run Thread.currentThread().getName()====" + Thread.currentThread().getName());
    System.out.println("run getName()====" + this.getName());
  }

  
  
}

代码CountOperateMain:

package thread.currentThread;

public class CountOperateMain {
  public static void main(String[] args) {
    CountOperate thread = new CountOperate();
    thread.setName("countOperate");
    //thread.start();
    
    Thread mainThread = new Thread(thread);
    mainThread.setName("mainThread");
    mainThread.start();
    
  }
}

运行CountOperateMain返回结果如下:

countOperate Thread.currentThread().getName()====main
countOperate getName()=====Thread-0
run Thread.currentThread().getName()====mainThread
run getName()====countOperate

解析: 1.Thread.currentThread().getName()获取的是当前调用这部分程序块的线程; 2.如构造函数是由Main的线程调用的; 3.如CountOperate线程是作为参数target传入mainThread,被mainThread调用的,则返回的是mainThread 4.如this.getName()获取的则是这个线程对象的名称;

java多线程编程之一(start和run的区别)

java多线程的start和run方法的区别

代码MyRunnable:

package thread;

public class MyRunnable implements Runnable{
  private int i;
  
  public MyRunnable(int i){
    super();
    this.i = i;    
  }
  
  @Override
  public void run() {
    // TODO Auto-generated method stub
    System.out.println("MyRunnable is running...");
  }
  
}

代码MyThreadTest:

package thread;

public class MyThreadTest {
  public static void main(String[] args) {
    MyRunnable runnable = new MyRunnable(1);
    //thread0.run();
    
    Thread thread1 = new Thread(runnable);
    thread1.start();
    
    System.out.println("main is running...");
    
  }
}

运行MyThreadTest返回结果如下:

main is running...
MyRunnable is running...

Thread运行的原理图

java线程运行原理

  1. Thread调用start方法,之后会调用start0(),start0()是native方法,调用JVM中JVM_startThread,之后调用vmSymbolHandles的run_method_name,最后回回调Thread中的run方法。
  • 调用顺序如下

      >MainThread
      >>Thread.start()
      >>>Thread.start0()
      >>>>JVM中JVM_startThread()
      >>>>>vmSymbolHandles的run_method_name
      >>>>>>Thread.run()
    

github jekyll upgrade show many problems

github的jekyll升级之后导致一系列问题

win7上搭建ruby开发环境 1. 安装ruby

可使用windows下的ruby安装工具rubyinstaller来方便地安装ruby解释器,可以http://rubyinstaller.org/网站上下载得到。安装时,看清安装的辅助选项,如是否将安装路径添加到环境变量中等。注意安装路径中不要有空格,否则会影响rails的安装。安装完成后,进入命令窗口,输入命令:ruby –v,如果能够显示ruby的版本,则说明安装成功。

  1. 安装gem系统(在线)

RubyGems(简称 gems)是一个用于对 Rails 组件进行打包的 Ruby 打包系统。 它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。gem系统类似于redhat操作系统中的yum工具,或debian操作系统中的apt-get工具。安装gem系统,可继续在控制台输入命令:gem update –-system

  1. 安装rails(在线)

Ruby on Rails (简称rails) 是一个可以使你开发,部署,维护 web 应用程序变得简单的框架。执行命令:gem install rails 即可安装。因为需要安装的东西很多,所以需要稍等一会儿。安装完成后,进入命令窗口,输入命令:rails -v,即可rails的版本号。但我在安装过程中遇到两个问题:

系统提示SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://bb-m.rubygems.org/gems/multi_json-1.3.2.gem)。这是说系统中的ssl设置有问题。可以参考这篇文章来解决:《OpenSSL Errors and Rails – Certificate Verify Failed》 :http://railsapps.github.io/openssl-certificate-verify-failed.html。因为自己使用的win7系统,所以参照了文章中提到的Fnichol提供的解决办法(https://gist.github.com/fnichol/867550)来解决。我使用的the manual way (boring)方法,因为尝试第一种自动化的方法时,ruby程序执行出错。我看了下,可能需要在源程序中将ruby的安装路径改为我自己机器上的安装路径。因为只是猜测,加上我对ruby还一无所知,我就尝试了手工的方法。手工方法也就是:首先,在本地ruby的安装路径下(如D:\Ruby2000),新建一个名为cacert.pem的文件,cacert.pem下载地址:【】然后将网页上提供的cacert.pem中的内容复制到该文件并保存。然后设置一个名为SSL_CERT_FILE的环境变量,值为cacert.pem的路径即可。 使用gem update遇到这个问题,

原来是ruby没有包含SSL证书,所以Https的链接被服务器拒绝。

解决方法很简单,首先在这里下载证书(http://curl.haxx.se/ca/cacert.pem), 然后再环境变量里设置SSL_CERT_FILE这个环境变量,并把value指向这个文件

docker在windows下安装及共享文件夹配置

windows下安装docker

  1. 安装参考文献 windows下安装docker

  2. 安装问题总结

    • http://www.aixq.com/post-328.html

我的环境:WIN7 X64 + VirtualBox-4.3.20-96997-Win.exe

错误提示如下:

Unable to load R3 module D:\Program Files\Oracle\VirtualBox/VBoxDD.dll (VBoxDD):GetLastError=1790 (VERR_UNRESOLVED_ERROR)

返回 代码: E_FAIL (0x80004005) 组件: Console 界面: IConsole {8ab7c520-2442-4b66-8d74-4ff1e195d2b6}

docker环境下搭建Kafka教程

简介

Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。 Apache

第一步、搭建docker环境

docker虚拟化应用容器引擎,可以快速方便的搭建自己的环境。详细的可以参考之前的文章
* $docker images列出所有images
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lonpo/ubuntu        ubuntu              2bdf1ee34eec        About an hour ago   818.8 MB
lonpo/ubuntu        nginx               72cdd523f710        20 hours ago        227.7 MB
ubuntu              14.04               c29e52d44f69        8 days ago          188 MB
ubuntu              latest              c29e52d44f69        8 days ago          188 MB
hello-world         latest              91c95931e552        10 months ago       910 B
  • 创建一个容器并进入
	$ docker run -it lonpo/ubuntu:ubuntu

第二步、安装zookeeper并配置

* 下载zookeeper #wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 
* 修改zookeeper/conf/zoo.cfg并启动zookeeper
	cd zookeeper-3.4.6
	cp -rf conf/zoo_sample.cfg conf/zoo.cfg
	vi zoo.cfg
	./zkServer.sh start