1、概念了解
(1)程序是安装在磁盘上的一段指令集合,它是静态的概念。
(2)进程是运行中的程序,是动态的概念。每个进程有独立的资源空间。
(3)线程是轻量级的进程,是程序执行流的最小单位,是程序中一个单一的顺序控制流程。线程是进程中的一个实体,是被系统独立调度和分派的基本单位。
(4)多线程是在单个程序中可以同时运行多个不同的线程执行不同的任务。一个进程可以包含一个或者多个线程。一个程序实现多个代码同时交替运行就需要产生多个线程。线程本身不拥有系统资源,与同属一个进程的其他线程共享所在进程所拥有的资源。同一进程中的多个线程之间可以并发执行。CPU会随机抽出时间,让我们的程序一会做这件事,一会做另外一件事情。多线程的目的在于,最大限度地利用CPU资源,当某一线程的处理不需要占用CPU而只和I/O等资源打交道时,让需要占用CPU资源的其他线程有机会获得CPU资源。从根本上说,这就是多线程编程的最终目的。
(5)Java运行系统在很多方面依赖于线程,所有的类库设计都考虑到多线程。Java是纯面向对象语言,Java的线程模型也是面向对象的。
(6)创建线程的方式有两种:第一,通过继承Thread类创建线程,普通Java类如继承自Thread类,就成为一个线程类,并可通过该类的start方法来启动线程,执行线程代码。Thread子类可直接实例化,但在子类中必须覆盖run方法才能真正运行线程的代码。第二,通过实现Runnable接口创建线程,实现Runnable接口的类必须借助Thread类才能创建线程(本质上还是通过继承Thread来实现)。通过Runnable接口创建线程分为两步:创建实现Runnable接口的类的实例;创建一个Thread类对象,将第一步实例化得到的Runnable对象作为参数传入Thread类的构造方法。最后通过Thread类的start方法启动线程。
2、举例说明
(1)举例一:通过继承Thread类创建线程
package com.iotek.threadtest;
public class HelloThreadDemo {
public static void main(String[] args) {
HelloThread h1HelloThread = new HelloThread("A");
//h1HelloThread.setName("线程1");//自定义线程名字
h1HelloThread.start();//启动线程就会调用run方法
HelloThread h2HelloThread = new HelloThread("B");
//h1HelloThread.setName("线程2");
h2HelloThread.start();
}
}
class HelloThread extends Thread{
public HelloThread(String name) {
super(name);
}
@Override
public void run(){
for(int i = 0 ;i < 5 ;i++){
System.out.println(this.getName() + ":" + i);
}
}
}
(2)举例二:通过实现Runnable接口创建线程
package com.iotek.threadtest;
public class HelloRunnableDemo {
public static void main(String[] args) {
HelloRunnable helloRunnable = new HelloRunnable();
Thread thread = new Thread(helloRunnable,"A");
thread.start();
Thread thread2 = new Thread(helloRunnable,"B");
thread2.start();
}
}
/**
* Runnable接口优于Thread的地方
* 1、避免单继承的局限,一个类可以实现多个接口,但只能继承一个类。
* 2、适合资源的共享。
* @author 紫苏半夏
*
*/
class HelloRunnable implements Runnable{
@Override
public void run() {
for(int i = 0 ;i < 5 ;i++){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
(3)举例三:Runnable接口适合资源的共享
package com.iotek.threadtest;
public class SharedDataThreadDemo {
public static void main(String[] args) {
/*TicketThread ticketThread1 = new TicketThread("一号窗口");
ticketThread1.start();
TicketThread ticketThread2 = new TicketThread("二号窗口");
ticketThread2.start();*/
TicketRunnable ticketRunnable = new TicketRunnable();
Thread thread = new Thread(ticketRunnable, "一号窗口");
thread.start();
Thread thread1 = new Thread(ticketRunnable, "一号窗口");
thread1.start();
}
}
/*class TicketThread extends Thread{
private int ticket = 5;
public TicketThread(String name){
super(name);
}
@Override
public void run(){
while (true) {
System.out.println(this.getName() + ":" + (ticket--));
if(ticket < 1){
break;
}
}
}
}*/
class TicketRunnable implements Runnable{
private int ticket = 5;
@Override
public void run(){
while (true) {
System.out.println(Thread.currentThread().getName() + ":" + (ticket--));
if(ticket < 1){
break;
}
}
}
}