关于runnable,百度一下帖子无算,而无脑者甚众,可以看出java从业者素质差者居多,而葛龚莫辨、扞格难通者俯拾即是。
以下一句是我随手拿的一个解释:
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口
我们来看官方注释:
Represents a command that can be executed. Often used to run code in a different Thread
.
我英文不好,勉强翻译过来大概是:
代表一条可执行的指令,经常被用在另外的线程中执行代码
就是说,它的本质是一条指令而已,定义上与多线程毫无瓜葛,只是作为一种手段被嵌入thread中,而很多博主所谓的第二种“实现Runnable接口”实现多线程实际上也是借助于new thread ,如果没有new thread,根本不会有多线程,所以java实现多线程只有一种:new thread。
接下来我贴一下自己在android环境的测试记录:
public void click(View v){ Log.d("第一个activity 开启意图之前:", String.valueOf(System.currentTimeMillis())); startActivity(new Intent(MainActivity.this, SecondActivity.class)); Log.d("第一个activity 开启意图之后:", String.valueOf(System.currentTimeMillis())); Log.d("main id:", String.valueOf(Thread.currentThread().getId())); v.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub Log.d("runnable id:", String.valueOf(Thread.currentThread().getId())); finish(); Log.d("第一个activity finsh:", String.valueOf(System.currentTimeMillis())); } }, 2000); new Runnable() { @Override public void run() { // TODO Auto-generated method stub Log.d("runnable id2:", String.valueOf(Thread.currentThread().getId())); } }.run(); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub Log.d("thread id:", String.valueOf(Thread.currentThread().getId())); } }).start(); }
以下是log:
可以看到,只要没有new thread的话,都是主线程,管你有没有实现runnable呢。
唉,现在的码农,真是越来越不成个样子了...
另外备忘一条,android中,只要是说明文档中没有说明的,都按照同步操作来理解,比如startactivity(intent),异步操作一般都是有回调的,比如startanimation(animation)。
新年快乐么么哒