Unit09: 多线程基础      

* 线程
 * 线程用于并发执行多个任务。感官上像是"同时"执行
 *
 * 创建线程有两种方式。
 * 方式一:
 * 继承线程并重写run方法来定义线程要执行的任务代码

package day09;
/**
* 线程
* 线程用于并发执行多个任务。感官上像是"同时"执行
*
* 创建线程有两种方式。
* 方式一:
* 继承线程并重写run方法来定义线程要执行的任务代码
* @author adminitartor
*
*/
public class ThreadDemo1 {
public static void main(String[] args) {
Thread t1 = new MyThread1();
Thread t2 = new MyThread2();
/*
* 启动线程要调用start方法,不要直接调用
* run方法。
* 当线程启动后,被分配时间片开始运行时会
* 自动调用run方法。
*/
t1.start();
t2.start();
}
}
/**
* 第一种创建线程存在两个不足:
* 1:由于java是单继承,所以导致继承了Thread不能
* 在继承其他类,在实际开发中经常会出现继承冲突
* 问题
* 2:由于重写线程run方法,将线程要执行的任务定义
* 在了线程中,导致任务与线程有一个耦合关系,
* 不利于线程重用。
* @author adminitartor
*
*/
class MyThread1 extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("你是谁啊?");
}
}
}
class MyThread2 extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("我是查水表的!");
}
}
}

ThreadDemo1.java

* 方式二:创建线程的方式
 * 实现Runnable接口单独定义任务

package day09;
/**
* 方式二:创建线程的方式
* 实现Runnable接口单独定义任务
* @author adminitartor
*
*/
public class ThreadDemo2 {
public static void main(String[] args) {
Runnable r1 = new MyRunnable1();
Runnable r2 = new MyRunnable2(); Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2); t1.start();
t2.start();
}
}
class MyRunnable1 implements Runnable{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("你是谁啊?");
}
}
}
class MyRunnable2 implements Runnable{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("我是查水表的!");
}
}
}

ThreadDemo2.java

* 用匿名内部类形式完成线程两种方式的创建

package day09;
/**
* 用匿名内部类形式完成线程两种方式的创建
* @author adminitartor
*
*/
public class ThreadDemo3 {
public static void main(String[] args) {
//方式一
Thread t1 = new Thread(){
public void run(){
for(int i=0;i<1000;i++){
System.out.println("你是谁啊?");
}
}
}; //方式二
Runnable runn = new Runnable(){
public void run(){
for(int i=0;i<1000;i++){
System.out.println("我是查水表的!");
}
}
};
Thread t2 = new Thread(runn); t1.start();
t2.start(); }
}

ThreadDemo3.java

* 线程提供了一个静态方法currentThread
 * 该方法可以获取运行该方法的线程。

package day09;
/**
* 线程提供了一个静态方法currentThread
* 该方法可以获取运行该方法的线程。
* java中所有代码都是线程运行的,main方法也不例外。
* 当虚拟机启动后会创建一个线程来执行main方法。
* @author adminitartor
*
*/
public class Thread_CurrentThread {
public static void main(String[] args) {
//获取了运行main方法的线程
Thread main = Thread.currentThread();
System.out.println("运行main方法的线程是:"+main); dosome(); //自定义线程
Thread t = new Thread(){
public void run(){
Thread t = Thread.currentThread();
System.out.println("自定义线程:"+t);
dosome();
}
};
t.start();
} public static void dosome(){
Thread t = Thread.currentThread();
System.out.println("运行dosome方法的线程是:"+t);
} }

Thread_CurrentThread.java

* 线程提供了获取相关信息的方法

package day09;
/**
* 线程提供了获取相关信息的方法
* @author adminitartor
*
*/
public class Thread_Info {
public static void main(String[] args) {
//获取运行main方法的线程
Thread main = Thread.currentThread(); long id = main.getId();
System.out.println("id:"+id); String name = main.getName();
System.out.println("name:"+name); int priority = main.getPriority();
System.out.println("优先级:"+priority); boolean isAlive = main.isAlive();
System.out.println("isAlive:"+isAlive); //是否是守护线程
boolean isDaemon = main.isDaemon();
System.out.println("isDaemon:"+isDaemon); //是否被中断
boolean isInterrupted = main.isInterrupted();
System.out.println("isInterrupted:"+isInterrupted);
}
}

Thread_Info.java

* 线程的优先级
 * 线程的优先级有10个等级,分别用数字1-10表示
 * 其中1最低,10最高,5为默认值

package day09;
/**
* 线程的优先级
* 线程的优先级有10个等级,分别用数字1-10表示
* 其中1最低,10最高,5为默认值
* 也可以使用线程提供的常量:
* MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY
* @author adminitartor
*
*/
public class Thread_Priority {
public static void main(String[] args) {
Thread min = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("min");
}
}
};
Thread max = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("max");
}
}
};
Thread norm = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("nor");
}
}
};
min.setPriority(Thread.MIN_PRIORITY);
max.setPriority(Thread.MAX_PRIORITY); min.start();
norm.start();
max.start();
}
}

Thread_Priority.java

* Thread提供了一个静态方法
 * static void sleep(long ms)
 * 该方法可以让运行该方法的线程阻塞指定毫秒,当
 * 阻塞超时后线程会回到RUNNABLE状态等待再次并发运行

package day09;

import java.text.SimpleDateFormat;
import java.util.Date; /**
* Thread提供了一个静态方法
* static void sleep(long ms)
* 该方法可以让运行该方法的线程阻塞指定毫秒,当
* 阻塞超时后线程会回到RUNNABLE状态等待再次并发
* 运行
* @author adminitartor
*
*/
public class Thread_Sleep {
public static void main(String[] args) {
// 15:48:33
SimpleDateFormat sdf
= new SimpleDateFormat("HH:mm:ss");
while(true){
System.out.println(sdf.format(new Date())); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}

Thread_Sleep.java

* 守护线程
 * 守护线程也称为:后台线程

package day09;
/**
* 守护线程
* 守护线程也称为:后台线程
* 使用上与普通线程没差别,但是结束时机上有所不同
* 当一个进程结束时,该进程中的所有守护线程都要强制
* 结束。
* 当一个进程中的所有前台线程(普通线程)都结束使,
* 进程结束。
* @author adminitartor
*
*/
public class Thread_Daemon {
public static void main(String[] args) {
Thread rose = new Thread(){
public void run(){
for(int i=0;i<10;i++){
System.out.println("rose:let me go!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("rose:啊啊啊啊啊啊AAAAAAAaaaa....");
System.out.println("音效:噗通!");
}
}; Thread jack = new Thread(){
public void run(){
while(true){
System.out.println("jack:you jump!i jump!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}; rose.start();
//设置为后台线程,必须在start之前设置
jack.setDaemon(true); jack.start();
}
}

Thread_Daemon.java

* 线程提供了一个方法:void join()
 * 该方法是用来协调线程间同步运行的。
 * 异步:各干各的
 * 同步:有先后顺序的执行

package day09;
/**
* 线程提供了一个方法:void join()
* 该方法是用来协调线程间同步运行的。
* 异步:各干各的
* 同步:有先后顺序的执行
* @author adminitartor
*
*/
public class Thread_Join {
//表示图片是否下载完完毕的状态
public static boolean isFinish = false; public static void main(String[] args) { final Thread download = new Thread(){
public void run(){
System.out.println("down:开始下载图片...");
for(int i=1;i<=100;i++){
System.out.println("down:"+i+"%");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
}
System.out.println("down:图片下载完毕!");
isFinish = true;
}
}; Thread show = new Thread(){
public void run(){
System.out.println("show:开始显示图片..."); //先等待下载完成将图片下载完毕
try {
/*
* show线程执行到join方法时会进入
* 阻塞状态,直到download线程执行
* 完毕,才会解除阻塞。
*/
download.join();
} catch (InterruptedException e) {
e.printStackTrace();
} if(!isFinish){
throw new RuntimeException("图片没有下载完毕!");
}
System.out.println("show:显示图片完毕!");
}
}; download.start();
show.start();
}
}

Thread_Join.java

JAVASE02-Unit09: 多线程基础的更多相关文章

  1. Java基础知识笔记(四:多线程基础及生命周期)

    一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...

  2. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  3. JAVASE02-Unit010: 多线程基础 、 TCP通信

    多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...

  4. java多线程基础

    多线程基础 读书练习照猫画虎 package Threadtest; import java.util.Date; import java.util.concurrent.ArrayBlockingQ ...

  5. C#编程总结(二)多线程基础

    C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...

  6. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  7. Java多线程干货系列(1):Java多线程基础

    原文出处: 嘟嘟MD 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程 ...

  8. 多线程基础(五)NSThread线程通信

    5.多线程基础 线程间通信   什么叫线程间通信 在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信   线程间通信的体现 1个线程传递数据给另一个线程 在1个线程中执行完特定任务后, ...

  9. 多线程基础(三)NSThread基础

    3.多线程基础 NSThread的基本使用   如何使用NSThread创建新线程 创建线程之后是默认不执行的状态 创建三个线程:   通过name属性区别这些线程 接下来就是通过设置线程的优先级来设 ...

随机推荐

  1. python入门一

    python类型 编程语言主要从以下几个角度为进行分类,编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言. 编译型和解释型 编译型:在程序执行之前,有一个单独的编译过程,将程序翻译成 ...

  2. 关于mat2gray

    最小的是0,最大的是1,那么介于中间的那些值我们怎么处理? 那么事实上我们试了很多样例之后.. 我猜他是..每个步长step_length=1/(max-min+1) 然后每个值就会变成(val-1) ...

  3. Python爬虫学习(5): 简单的爬取

    学习了urllib,urlib2以及正则表达式之后就可以做一些简单的抓取以及处理工作.为了抓取方便,这里选择糗事百科的网页作为抓取对象. 1. 获取数据: In [293]: url = " ...

  4. iOS @@创建NSURL的字面量

    @@ 是创建 NSURL 的字面量的绝佳方法(例如:@@"http://example.com")

  5. Node.js-npm【1】-常用命令

    查看版本:npm -v 获取全局目录:npm config get prefix 设置全局目录npm config set prefix "D:\Program Files\nodejs\n ...

  6. java-集合4

    浏览以下内容前,请点击并阅读 声明 对象排序 一个List对象中如果元素类型为String,则其按字母表顺序排序,而如果元素类型为Date,则按照年代排序,那如何判断元素的排序呢?String和Dat ...

  7. DOM元素的大小和位置

    HTML: <div id="parent"> <div id="box"> 测试测试测试测试测试测试测试测试测试测试测试测试测试测试测 ...

  8. windows下调试virtualbox的虚拟机串口

    1.我不知道其他人是怎么实现的,我是这么实现的. 2.下载一个叫做VSPD的软件,其作用是在windosw上虚拟几个串口出来. 下载完了安装,安装完了注册,如果不是花钱买来的,那就自己想办法注册吧.我 ...

  9. Ubuntu14.10安装Eclipse

    方法一:(缺点是安装时附加openjdk等大量程序并无法去除,优点是安装简单) $ sudo apt-get install eclipse 方法二:(优点是安装内容清爽,缺点是配置麻烦) 1、安装J ...

  10. 00 EPLAN安装问题

    问题: EPLAN 安装结束后,无法创建项目,每次创建均会弹出提示框:内部错误 解决方案: 运行 Services.msc 禁用EPLAN Client Service  设置EPLAN使用管理员模式 ...