java基础10(多线程2)

  1. 线程的常用方法

public final void join()    线程加入

作用:等待该线程中止,其他线程才能继续抢着执行

public static void yield():  线程礼让

作用:暂停当前正在执行的线程对象,并执行其他线程。让线程间的执行更和谐一些,但是实际上做不到。

public final void stop():线程死亡:直接杀死

public void interrupt():线程死亡:直接杀死,在死前,还可以有遗言(会执行后面的代码,然后死去)。

static void sleep(long millis)  线程休眠:线程睡一会,会自己醒来

2.线程的生命周期

a.新建:创建一个线程对象

b.就绪:start()之后,有cpu的执行权,但没有抢到执行资格

c.运行:有cpu的执行权,也有cpu的执行资格

d.有可能阻塞:休眠或者等待

e.死亡:run()方法执行完毕,调用stop()或者interrup()方法

生命周期图如下:

3.线程间通信

定义:不同线程间针对同一个资源进行操作

Student -- 被设置的资源对应的类

setThread -- 设置线程

getThread -- 获取线程

StudnetDemo -- 测试类

public class Student {

private String name;

private int age;

//作为对象的一个标记,如果是false说明该对象没有数据

private boolean flag;

//提供公共的方法设置信息

public synchronized void setInfo(String name,int age){

if (this.flag) {

//等待

try {

this.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//没有值的话,在这里给对对象设置数据

this.name = name;

this.age = age;

//更改标记,唤醒获取线程获取数据

this.flag = true;

this.notify();

}

//提供公共的方法获取信息

public synchronized void getInfo(){

if (!this.flag) {

//没有值

try {

this.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//有数据,取数据

System.out.println(this.name+"--"+this.age);

//取完数据之后,就没有数据了

this.flag = false;

this.notify();

}

}

public class GetThread implements Runnable{

private Student s;

public GetThread(Student s){

this.s = s;

}

@Override

public void run() {

//获取线程,获取学生对象的姓名和年龄

while (true) {

s.getInfo();

}

}

}

}

public class SetThread implements Runnable{

private Student s;

private int x=0;

public SetThread(Student s){

this.s = s;

}

@Override

public void run() {

//给学生对象设置姓名和年龄

while (true) {

if (x%2==0) {

s.name = "周杰伦";

s.age = 40;

}else {

s.name = "林宥嘉";

s.age = 30;

}

x++;

}

}

}

public class StudentDemo {

public static void main(String[] args) {

//创建学生对象

Student s = new Student();

//创建设置线程和获取线程

SetThread st = new SetThread(s);

GetThread gt = new GetThread(s);

Thread t1 = new Thread(st);

Thread t2 = new Thread(gt);

//开启线程

t1.start();

t2.start();

}

}

4.线程组

定义:Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。默认情况下,所有的线程都属于主线程组。

主要方法:

public final ThreadGroup getThreadGroup():获取线程对应的线程组对象

Thread(ThreadGroup group, Runnable target):线程设置分组

案例1:创建线程获取对应的线程组对象,并获取名称

//创建两个线程

MyThread mt1 = new MyThread();

MyThread mt2 = new MyThread();

//获取上面两个线程对应的线程组对象

ThreadGroup tg1 = mt1.getThreadGroup();

ThreadGroup tg2 = mt2.getThreadGroup();

//获取线程组对象的名称

System.out.println(tg1.getName());

System.out.println(tg2.getName());

案例2:创建线程组对象,给线程分配线程组

ThreadGroup tg = new ThreadGroup("big");

Thread t3 = new Thread(tg, new MyRunnable());

Thread t4 = new Thread(tg, new MyRunnable());

//获取t3和t4的线程组对象

ThreadGroup tg3 = t3.getThreadGroup();

ThreadGroup tg4 = t4.getThreadGroup();

System.out.println(tg3.getName());

System.out.println(tg4.getName());

5.线程池

引入原因:程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。

特点:线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。

线程池的创建方法:

public static ExecutorService newFixedThreadPool(int nThreads)

线程池的使用步骤:

a.创建线程池对象

ExecutorService pool = Executors.newFixedThreadPool(2);

b.创建Runnable实例

MyRunnable my = new MyRunnable();

c.提交Runnable实例

pool.submit(my);

pool.submit(my);

d.关闭线程池

pool.shutdown();

6.定时器(Timer):

主要方法:

public Timer()构造

public void schedule(TimerTask task, long delay)延迟多久执行任务

public void schedule(TimerTask task,long delay,long period)延迟多久执行任务,并以后每隔多久执行一次

public boolean cancel()取消这个任务

TimerTask

public abstract void run()放的是所要执行的任务代码

案例:延迟5秒钟,打印hellojava,以后每隔一秒打印一次

public static void main(String[] args) {

Timer t = new Timer();

t.schedule(new MyTimerTask2(), 5000, 1000);

/**

* 参数1:要执行的任务

* 参数2:延迟多久执行

* 参数3:执行一次之后,每隔多久重复执行

*/

}

}

class MyTimerTask2 extends TimerTask{

@Override

public void run() {

System.out.println("hellojava");

}

}

时间: 2024-11-03 21:24:48

java基础10(多线程2)的相关文章

Java基础10:全面解读Java异常

Java基础10:全面解读Java异常 为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用. 在没有异常机制的时候我们是这样处理的:通过函数的返回值来判断是否发生了异常(这个返回值通常是已经约定好了的),调用该函数的程序负责检查并且分析返回值.虽然可以解决异常问题,但是这样做存在几个缺陷: 1. 容易混淆.如果约定返回值为-11111时表示出现异常,那么当程序最后的计算结果真的为-1111

Java基础10 接口的继承与抽象类(转载)

接口继承 接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型.比如,我们以Cup作为原interface: interface Cup{    void addWater(int w);    void drinkWater(int w);} 我们在继承Cup的基础上,定义一个新的有刻度的杯子的接口,MetricCup 接口如下: interface MetricCup extends Cup{    int WaterContent

java基础10:正则表达式与反射

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【BigData】Java基础_多线程

所谓的多线程就像小吃街卖铜锅米线的老板,老板就好比一个操作系统,如果5个顾客同时去买米线,那么,此时老板就会同时准备好5个铜锅,然后同时放上水.调料.米线,同时煮5个人的米线,如果逐个煮的话,那么估计煮了2个人的米线,后面3人就来找老板退款了. 官方解释:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术 在Java中实现多线程四部曲: (1)将需要用多线程方式执行的逻辑,写入一个runnable实现类中(run方法中): (2)创建出这个runnabl

Java基础4——多线程

线程依赖于进程而存在 进程:正在运行的程序 是操作系统进行资源分配和调度的独立单位 每个进程都有自己的内存空间和系统资源 多进程的意义:单进程的计算机只能做一件事情 DOS窗口就是典型的单进程 多进程的计算机可以在一个时间段内执行多个任务 单核CPU在某个时间点只能执行一件事情,事实上CPU一直在高效切换各个进程 线程:一个进程内可以执行多个任务,每个任务可以看成是一个线程,线程是程序(进程)的执行单元或执行路径,是程序使用CPU的最小单位 多线程的意义:提高应用程序的使用率 程序的执行都是在抢

3.8 java基础总结①多线程

多线程 多线程这章理论大于实践,因为在实际开发中多线程的都封装到框架里边了的,程序员一般不会写多线程,多线程属于Java里边比较底层的代码了. 线程是处理器调度的最基本单位程序>进程>线程程序是死的,当启动程序得时候会有一个或几个进程,每个进程里边可以有诺干线程.基于线程开销更 创建线程:两种方法1.声明Thread的子类,重写run方法class MyThread extends Thread{ public void run(){ }}Mythread a = new MyThread()

黑马程序员-Java基础之多线程

多线程 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺序. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量. jvm在启动的时,首先有一个主线程,负责程序的执行,调用的是main函数.主线程执行的代码都在main方法中. 当产生垃圾时,收垃圾的动作,

Java基础总结--多线程总结2

----多线程通信-----1.概述:多个线程处理同一个资源,但是各自的任务不相同eg:线程1负责存储数据,线程2负责处理该数据.数据--就是同一个资源怎样用java语言描述上面的例子:* 资源是变化的--数据是变化的--将其封装为对象* 存在两个任务不同的线程,需要2个run方法--所以封装在两个不同的线程类中* 必须保证输入和输出处理的是同一个对象-输入输出构造方法传参数(参数为资源对象引用)* 主函数里面,创建资源对象,线程类对象,启动线程2.多线程通信依然会出现线程安全的问题解决办法--

Java基础教程——多线程:创建线程

多线程 进程 每一个应用程序在运行时,都会产生至少一个进程(process). 进程是操作系统进行"资源分配和调度"的独立单位. Windows系统的"任务管理器"可以查看系统的进程,通过Ctrl+Shift+Esc组合键可以调出"任务管理器". 进程具有三个特征: 独立性:进程拥有自己独立的资源,有私有的地址空间. 动态性:程序是静态的指令集合,而进程是活动的指令集合,进程有其生命周期. 并发性:多个进程可以在同一个处理器上并发执行,互不影响.