线程实际上是在进程的基础上进一步划分
如果一个进程没有了,则线程肯定会消失,那么如果线程消失,但是进程未必会消失;
所有的线程都是在进程的基础上并发(同时运行)
电脑上的多核cpu指的是电脑上会存在多个cup,此时会产生并发执行;
在java中,如果要实现多线程也可以采用以下两种方式来解决,但不限于这两种方法;
1:继承Thread类;
2:实现Runnable接口
Thread类:一个类只要继承了Thread类,此类就称为多线程操作类,在Thread子类中必须明确覆写Thread的run()方法,此方法为线程的主体:
多线程定于语法:
class 类名称 extends Thread{
属性。。。;
方法。。。;
//覆写Thread类中的run()方法此方法是线程的主体
public void run(){
线程主体
}
}
实例:
class ThreadDemo1 extends Thread{
private String name ;
public ThreadDemo1(String name) {
this.name = name ;
}
@Override
public void run() {
for (int x =0 ; x <= 10 ; x ++) {
System.out.println(name + “线程编号” + x );
}
}
}
public class Test {
public static void main(String[] args) throws Exception{
ThreadDemo1 td1 = new ThreadDemo1("线程A");
ThreadDemo1 td2 = new ThreadDemo1("线程B");
td1.start();
td2.start();
}
}
运行结果:
线程A线程编号0
线程B线程编号0
线程A线程编号1
线程A线程编号2
线程A线程编号3
线程A线程编号4
线程A线程编号5
线程A线程编号6
线程A线程编号7
线程A线程编号8
线程A线程编号9
线程A线程编号10
线程B线程编号1
线程B线程编号2
线程B线程编号3
线程B线程编号4
线程B线程编号5
线程B线程编号6
线程B线程编号7
线程B线程编号8
线程B线程编号9
线程B线程编号10
线程中运行时谁先抢到cpu进程谁先执行;
在JDK的src.zip中全是java源程序代码,可以直接找到java.lang.Thread类,就可以打开Thread类的定义;
start方法有可能抛出异常:
native关键字表示的是一个由java调用的本机操作系统方法的关键字,在java中运行java程序调用本级的操作系统的方法以完成特定的功能
如果现在要想实现多线程的话,则需要操作系统的支持,因为多线程中牵扯到一个抢占cpu的情况,要等待cpu进行调度,那么这一点肯定需要操作系统的底层支持,所以要使用native调用本级的系统方法;
在java中操作系统中多线程的实现底层代码肯定是不同的,所以使用nativet关键字也可以让jvm自动去调整不同的jvm实现
Thread start也表示一种状态,如果线程已经启动了,再调用start方法的时候就可能产生异常
Runnable:
在java中也可以通过实现Runnable接口的方式实现多线程,Runnable接口中之定义了一个抽象方法:
public void run()
通过Runnable接口实现多线程
class 类名称 implements Runnable{
属性。。;
方法。。。;
public void run(){
线程主体;
}
}
在Runnable中没有start()方法
Thread类的构造
public Thread(Runnable target)
就利用以上构造方法,启动多线程
实例:
package TestDemo;
class ThreadDemo1 implements Runnable{
private String name ;
public ThreadDemo1(String name) {
this.name = name ;
}
@Override
public void run() {
for (int x =0 ; x <= 10 ; x ++) {
System.out.println(name + “线程编号” + x );
}
}
}
public class Test {
public static void main(String[] args) throws Exception{
ThreadDemo1 td1 = new ThreadDemo1("线程A");
ThreadDemo1 td2 = new ThreadDemo1("线程B");
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}
此时完成了多线程的功能
接口Runnable会避免单继承(Thread是通过继承来实现的);
那么到底在实际开发中改使用Thread还是Runnable呢?
Thread定义:Thread也是Runnable接口的子类
区别:
使用Thread类在操作多线程的时候,无法达到资源共享的目的;而使用Runnable接口实现了多线程的操作;可以实现资源共享;
通过多个相同程序代码区处理一个资源,可以避免由于单继承局限带来的影响,增强了代码的健壮性,代码能够被多个线程共享,代码与数据是独立的
线程状态:
创建状态:准备好了一个多线程对象 Thread t = new Thread()
就绪状态:调用了start方法,等待cpu进行调度
运行状态:执行run();
阻塞状态:暂时停止执行没可能将资源交给其他线程使用
终止状态(死亡状态):线程执行完毕;
总结:
1:进程与线程的区别,关系:线程是在进程的基础上划分的,线程消失,进程不会消失,进程消失,线程肯定消失;
2:java进程实现的两种方式:
继承Thread(start方法直接执行),接口Runnable(实例化Thread后使用Run方法启动);
在多线程中建议使用Runnable接口实现,可以避免单继承局限,而且通过Runnable接口可以实现资源共享
6 线程的状态问题.