Java中实现多线程主要有两种方式:继承Thread类、实现Runnable接口。
Thread类存放于java.lang类库中,系统默认加载这个包,所以可以直接使用Thread类。
class myThread extends Thread{
属性
方法
修饰符 run(){ //激活的线程将从run()方法开始执行
要执行的代码块
}
}
new myThread().start(); //在程序中需要执行线程的地方插入此语句,激活线程
在Java中不允许多继承,一个子类只能有一个父类,但是可以通过实现接口的方式达到多继承效果。因此,可以实现Runnable接口来创建线程。
class MyThread implements Runnnable(){
属性
方法
public void run(){
要执行的代码块
}
}
MyThread myThread = new MyThread(); //实例化一个MyThread类型对象
new Thread(myThread).start(); //使用Thread类的start方法激活此线程
Runnable接口实现的线程类需要调用Thread类中的start()方法是由于Runnable接口中只有一个run()方法,没有start()方法。
举一个多线程的例子
public class ThreadDemo extends Thread {
public static void main(String[] args) {
// TODO 自动生成的方法存根
ThreadDemo t1 = new ThreadDemo();
t1.start();
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
for(int i=0;i<3;++i){
t1.Msg(); //Msg()中调用了currentThread(),
//调用Msg()方法间接调用了currentThread()
//要注意的是,调用者是main线程,并非子线程实例t1
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public void run(){
for(int i = 0; i<3; ++i){
Msg();
try{
Thread.sleep(1000); //休眠线程1s
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public void Msg(){
Thread t = Thread.currentThread(); //currentThread()是静态方法,
//调用时要跟在类名后而非对象名,
//该方法返回执行该方法的线程实例
String name = t.getName(); //获取线程名
System.out.println("name = "+name);
}
}
运行结果:
在之前《MPD解析模块在Android中的实现》一文中,对耗时的MPD下载、解析过程创建了子线程,因为子线程不能对UI进行操作,于是调用showResponse(final String response)方法,将子线程的解析结构结果以string对象传递给UI线程,之后经过TextView显示出来。
private void showResponse(final String response) {//子线程中不允许进行UI操作,因此利用showResponse()方法切换到主线程更新
runOnUiThread(new Runnable() {
@Override
public void run() {
responseText.setText(response);//创建一个TextView显示传入字符串
}
});
}
---------------------
原文:
在Android中Java多线程还有一个常见的用处,设置启动页。如果想在已有MainActivity基础上增加一个图片主题的启动页,可以利用多线程延迟MainActivity的启动,并在其启动之前调用布局的图片。
public class DisplayActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display);
new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(3000); //MainAvtivity的启动时间延迟3秒
}catch(InterruptedException e){
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
//跳转至 MainActivity
Intent intent = new Intent(DisplayActivity.this, MainActivity.class);
startActivity(intent);
//结束当前的 Activity
DisplayActivity.this.finish();
}
});
}
}).start();
}
}
即在MainActivity之前增加DisplayActivity,DisplayActivity的layout文件中仅布局一张图片,这样即可实现Android App启动页(广告)设置。