多线程--线程的创建与启动

创建一个线程,Java提供三种方法

(1)通过实现Runnable接口,重写run方法

(2)通过继承Thread类本身,--必须重写

(3)通过Callable和Future创建线程

Thread类的方法

void start()使该线程开始执行,Java虚拟机调用该线程的run方法。

final void setName(String name)改变线程名称,使之与参数name相同

setPriority(int priority)更改线程的优先级

join(long millisec)等待该线程终止的时间最长为milli毫秒

interrupt()中断线程

boolean isAlive()测试线程是否处于活动状态

上述方法被Thread对象调用

下面的方法是Thread类的静态方法static

yield()放弃CPU的使用权力

sleep(long millisec)休眠线程

currentThread()获得正在执行的线程对象

概念解析:

并行:是真正的同时。

并发:通过CPU调度算法,用户看上去同时执行,实际上从CPU层面上不是真正同时。

线程安全:并发情况下,多线程使用,线程调度顺序不影响任何结果。

同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问称为线程安全的--结果正确。

Thread和Runnable的区别

如果一个类继承Thread,则不合适资源共享,但是如果实现了Runnable接口,则很容易实现资源共享。

线程是CPU的调度单位,进程是操作系统的调度单位。

Method类中有个方法invoke()

public Object invoke(Object obj,Object ...args)

通俗点讲就是:对象调用的方法(对象.参数)



守护线程(DaemonThread)

守护线程具有最低的优先级;

是用来服务用户线程的。

(1)thread.setDaemon(true)必须在thread.start()之前设置。

(2)在Daemon线程中产生的新的线程也是Daemon的。

(3)守护线程不去访问固有的资源,如文件,数据库。

用户线程(userThread)

Thread和Runnable创建出来的线程。

线程的生命周期大体分为5种状态

1.New:通过new创建了Thread类或其子类对象。

2.Runnable: a)指Thread类对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;b)线程在处于Runnable状态时并没有运行完自己的run方法,时间片用完之后回到Runnable状态; c) 处于Blocked状态的线程结束当前的Blocked状态之后重新回到Runnable状态。

3.Running:线程已获CPU运行。

4.Dead:处于Running的线程,执行完run方法之后,就变成了Dead状态。

5.Blocked:处于Running状态的线程出于某种原因,让出当前CPU 给其他线程。



线程的创建与启动

继承Thread类:重写run方法

 1 package NiuMuThread;
 2
 3 public class MyThread extends Thread{
 4
 5     @Override
 6     public void run() {
 7         // TODO Auto-generated method stub
 8         for(int i=0;i<100;i++) {
 9 //            线程的静态方法-----当前线程----的名字
10             System.out.println(Thread.currentThread().getName()+":"+i);
11             try {
12                 Thread.sleep(100);
13             } catch (InterruptedException e) {
14                 // TODO Auto-generated catch block
15                 e.printStackTrace();
16             }
17         }
18     }
19 }

实现Runnable接口:重写run方法

 1 package NiuMuThread;
 2
 3 public class MyThread2 implements Runnable{
 4
 5     @Override
 6     public void run() {
 7         // TODO Auto-generated method stub
 8         for(int i=0;i<100;i++) {
 9 //            线程的静态方法-----当前线程----的名字
10             System.out.println(Thread.currentThread().getName()+":"+i);
11             try {
12                 Thread.sleep(100);
13             } catch (InterruptedException e) {
14                 // TODO Auto-generated catch block
15                 e.printStackTrace();
16             }
17         }
18     }
19 }

测试:

 1 package NiuMuThread;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6         //第一个线程
 7         MyThread thread=new MyThread();
 8         //第三个线程
 9         MyThread2 r=new MyThread2();
10
11         Thread th2=new Thread(r);
12         thread.start();//启动线程
13         th2.start();
14
15         //第二个线程
16         for(int i=0;i<100;i++) {
17 //            线程的静态方法-----当前线程----的名字
18             System.out.println(Thread.currentThread().getName()+":"+i);
19             try {
20                 Thread.sleep(100);
21             } catch (InterruptedException e) {
22                 // TODO Auto-generated catch block
23                 e.printStackTrace();
24             }
25         }
26     }
27 }

注意:通过实现Runnable接口的,需要 new Thread(runnable),才能创建线程对象

***在线程的Thread对象上调用start()方法,而不是run()或者别的方法。

一些常见的问题

1.线程的名字,一个运行中的线程总是有名字的,名字有两个来源,一是虚拟机自己给的名字,或者是你自己定的名字。在没指定线程名字的情况下,虚拟机会为线程指定名字,主线程的名字是main,非主线程的名字不确定。

2.线程都可以设置名字,也可以获取线程的名字。

3.获取当前线程的对象的方法是:Thread.currentThread();

4.在上面代码中,只能保证:每个线程都将启动,每个线程都将运行直到完成。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。

5.当线程目标run()方法结束时线程完成。

6.一旦线程启动,它就永远不能在重新启动。只有一个新的线程可以被重新启动,并且只能一次。一个可运行的线程或者死线程可以被重新启动。

7.线程的调度是JVM的一部分,在一个CPU的机器上,实际上一次只能运行一个线程。一次只有一个线程栈运行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。

众多可运行线程中的某一个会被选中作为当前线程。可运行线程被选择的顺序是没有保障的。

8.尽管通常采用队列形式,但这是没有保障的。队列形式是指当一个线程完成“一轮”时,它移到可运行队列的尾部等待,直到它最终排队到该队列的前端为止,它才能被再次选中。事实上,我们把它称为可运行池而不是一个可运行队列,目的是帮助认识线程并不都是以某种有保障的顺序排列。

9.尽管我们没有无法控制线程调度程序,但可以通过别的方式来影响线程的调度方式。

原文地址:https://www.cnblogs.com/xjs1874704478/p/10742672.html

时间: 2024-08-07 03:19:09

多线程--线程的创建与启动的相关文章

Java语言基础-多线程-①线程的创建和启动

简单阐释进程和线程 对于进程最直观的感受应该就是“windows任务管理器”中的进程管理: (计算机原理课上的记忆已经快要模糊了,简单理解一下):一个进程就是一个“执行中的程序”,是程序在计算机上的一次运行活动.程序要运行,系统就在内存中为该程序分配一块独立的内存空间,载入程序代码和资源进行执行.程序运行期间该内存空间不能被其他进程直接访问.系统以进程为基本单位进行系统资源的调度和分配.何为线程?线程是进程内一次具体的执行任务.程序的执行具体是通过线程来完成的,所以一个进程中至少有一个线程.回忆

Java线程:创建与启动

Java线程:创建与启动 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法:否则,该方法不执行任何操作并返回.   Thread 的子类应该重写该方法. 2.实现java.lang.Runnable接口. void run() 使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独

03_线程的创建和启动_实现Runnable接口方式

[线程的创建和启动的步骤(实现Runnable接口方式)] 1.定义Runnable接口的实现类,并重写其中的run方法.run()方法的方法体是线程执行体.class SonThread  implement Runnable{ public void run(){......}} 2.创建Runnable接口实现类的实例.   sonThread s1=new SonThread(); 3.用该实例作为Thread的target来创建Thread对象.   Thread t1 =new Th

02_线程的创建和启动_继承Thread方式

[简述] java使用Thread类代表线程,所有的线程都必须是Thread或者其子类的实例. 每个线程的任务就是完成一定的任务,实际上就是执行一段程序流. [创建并启动多线程的步骤(集成Thread类方式)] 1.定义继承Thread类的子类,重写run方法:run()方法就代表了线程需要完成的任务,故run()方法称为:线程执行体. 2.创建线程对象:即创建Thread子类的实例. 3.启动线程:调用线程对象的start()方法来. [示例代码FirstThread.java] packag

第二十七节(多线程、线程的创建和启动、生命周期、调度、控制、同步)

线程指进程中的一个执行场景,也就是执行流程,那么进程和线程的区别是什么 1. 每个进程是一个应用程序,都有独立的内存空间 2. 同一个进程中的线程共享其进程中的内存和资源 (共享的内存是堆内存和方法区内存,栈内存不共享,每个线程有自己的) 什么是进程? 一个进程对应一个应用程序. 例如:在 windows 操作系统启动 Word 就表示启动了一个进程.在 java 的开发环境下启动 JVM, 就表示启动了一个进程.现代的计算机都是支持多进程的,在同一个操作系统中,可以同时启动多个进程. /* 分

01_线程的创建和启动

1.线程的使用步骤 2.第一种定义线程类的方法:继承java.lang.Thread类 MyThread 文件: public class MyThread extends Thread { private int count=0; @Override public void run() { System.out.println("线程已启动"); while(count<10000) { count++; } System.out.println("count:&qu

Java多线程之线程的创建

好久没有更博客了,最近一直在忙工作的事情.现在终于空下来了,这2天会抓紧时间整理多线程和socket,把JavaSE结束掉. 关于多线程,首先会涉及到哪些东西呢?首先要了解线程,为什么要使用线程,线程有什么优势,线程和进程有什么区别呢?了解过大致的线程内容后,就应该编码来实现Java的多线程了.首先2种方式来创建线程类,然后调用对应的API来控制线程.然后还剩下一个最大的也是最重要的一块知识,就是线程同步.前面那些了解线程的生命周期就可以,实际编码中并不会多次写到那些编码,但是线程的同步经常要用

Java总结(九)——(线程模块 一(线程的创建(方法一)与启动,线程状态与生命周期,进程与线程))

一.进程与线程 进程:每一个独立运行的程序称为一个进程 线程:线程时一个进程内部的一条执行路径,Java虚拟机允许程序并发的运行多个执行路径 *进程中执行运算的最小单位-->线程<--处理机分配 进程与线程的区别: (1)进程有独立的运行地址空间,一个进程崩溃后不会影响到其他的进程,而线程只是 一个进程中的一个执行路径,如果有一条线程奔溃了,可能会影响到进程中的的其他线程 (2)线程有自己的栈和局部变量,多个线程共享同一进程的地址空间 (3)一个进程至少有一个线程 多线程 (1)多线程 就是在

创建和启动线程

java线程: 线程是一个程序内部的顺序控制流. cpu实际上在一个时间点上,只执行一个.只不过我们把cup分成了多个时间片,由于速度很快,我们看起来像是多个线程.. 就像你的时间分成几片,这样 整体看来做事情有规律,效率就会高,何况是cup呢. 线程的创建和启动: 方法一: java线程通过java.lang.Thread类来实现. VM启动时会有一个主方法所定义的线程, 每一个线程是Tread对象通过它的run()方法来完成操作. 启动线程方式:Thread的start()方法. 例如: p