前言
Java当中实现多线程的方法主要有两种方式:集成Thread类和实现Runnable接口定义线程的运行时行为,本文简单介绍一下Thread的简单使用
Thread简介
(1) 定义
Thread:Java中实现线程的具体类,封装了所有的线程操作,通过Thread实例来控制线程行为(运行,停止)
(2)作用
实现多线程
(3)优点
实现简单 ,只需要继承Thread类并重写run()方法即可
(4)缺点
局限性大:由于集成了Thread类,而Java为单继承方式,意味着当前线程不能再继承其他的类。
无法共享资源:由于创建一个线程就常见了一个线程实例,而线程实例之间的数据无法进行共享。
资源消耗大:线程为相当于“一次性消耗品”,当运行完后就需要进行销毁,有当有多个耗时任务时就需要对应开启多个线程进行处理,且开启销毁多个线程本身就会消耗大量资源。
Thread的使用方法
Thread主要有两种使用方法:(1)标准方式(2)匿名方式
(1)标准方式
public class MainActivity extends AppCompatActivity {
//1.继承Thread类
class MyThread extends Thread{
//2.重写run方法
@Override
public void run() {
super.run();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建线程实现
MyThread myThread=new MyThread();
//通过线程实例控制线程的运行状态(运行,停止)
myThread.start();
}
}
(2)匿名方式
//1.创建线程实例
new Thread(){
//2.重写run方法
@Override
public void run() {
super.run();
}
//通过线程实例控制线程的行为(运行、停止)
}.start();
两种方法的对比
名称 | 优点 | 缺点 |
---|---|---|
标准方式 | 线程类和对象可以复用 | 代码量大,操作复杂 |
匿名方式 | 代码简洁 | 无法复用线程实例对象 |
这也就是说如果有多个地方用到了线程类则选择标准方式,如果该线程只在一处使用则可以考虑匿名方式。
实际使用
模仿售票,一共有两个服务窗口,每一秒售出一张票,每个窗口有100张票。
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.zhqy.threaddemo.MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:text="售票"
/>
</android.support.constraint.ConstraintLayout>
MainActivity.java:
package com.zhqy.threaddemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TicketThread th1=new TicketThread("th1");
TicketThread th2=new TicketThread("th2");
th1.start();
th2.start();
}
});
}
//1.继承Thread类
class TicketThread extends Thread{
//初始化票数
int ticket=100;
String name;
public TicketThread(String name){
this.name=name;
}
@Override
public void run() {
super.run();
//卖票
while (ticket>0){
Log.e(name,"剩余票数:"+(--ticket));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
测试结果
08-26 10:12:00.903 5311-5362/com.zhqy.threaddemo E/th1: 剩余票数:99
08-26 10:12:00.903 5311-5363/com.zhqy.threaddemo E/th2: 剩余票数:99
08-26 10:12:01.903 5311-5363/com.zhqy.threaddemo E/th2: 剩余票数:98
08-26 10:12:01.903 5311-5362/com.zhqy.threaddemo E/th1: 剩余票数:98
08-26 10:12:02.904 5311-5363/com.zhqy.threaddemo E/th2: 剩余票数:97
08-26 10:12:02.904 5311-5362/com.zhqy.threaddemo E/th1: 剩余票数:97
08-26 10:12:03.904 5311-5362/com.zhqy.threaddemo E/th1: 剩余票数:96
08-26 10:12:03.904 5311-5363/com.zhqy.threaddemo E/th2: 剩余票数:96
08-26 10:12:04.905 5311-5362/com.zhqy.threaddemo E/th1: 剩余票数:95
08-26 10:12:04.905 5311-5363/com.zhqy.threaddemo E/th2: 剩余票数:95
08-26 10:12:05.905 5311-5363/com.zhqy.threaddemo E/th2: 剩余票数:94
08-26 10:12:05.905 5311-5362/com.zhqy.threaddemo E/th1: 剩余票数:94
08-26 10:12:06.905 5311-5362/com.zhqy.threaddemo E/th1: 剩余票数:93
08-26 10:12:06.905 5311-5363/com.zhqy.threaddemo E/th2: 剩余票数:93
.....
从测试结果可以看出两个线程的资源并没有共享,这是由于各个线程相对独立(不是同一个线程实例)。
以上就是Thead类实现多线程的全部内容。
网友评论