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. 基于Struts2CRUD的质量属性

    基于struts2框架开发的<学生管理系统>的质量属性 我们经常重新设计系统,可能不是因为该系统在功能上有缺陷,而是由于:系统运行速度太慢.系统容易受到外界攻击.用另外的一句话说:我们修改 ...

  2. 逻辑回归(Logistic Regression)

    转载请注明出自BYRans博客:http://www.cnblogs.com/BYRans/ 本文主要讲解分类问题中的逻辑回归.逻辑回归是一个二分类问题. 二分类问题 二分类问题是指预测的y值只有两个 ...

  3. iOS LaunchImage 各尺寸

  4. Tensorflow word2vec编译运行

    Word2vec 更完整版本(非demo)的代码在 tensorflow/models/embedding/     首先需要安装bazel 来进行编译 bazel可以下载最新的binary安装文件, ...

  5. MYSQL外键(Foreign Key)的使用

    在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束.外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持): ...

  6. php中session原理及安全性问题

    有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制   我们先简单的了解一些http的知识,从而理解该协议 ...

  7. HTTP Keep-Alive模式

    1.什么是Keep-Alive模式? 我们知道HTTP协议采用"请求-应答"模式, 当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 ...

  8. HDU5942 : Just a Math Problem

    \[\begin{eqnarray*}ans&=&\sum_{i=1}^ng(i)\\&=&\sum_{i=1}^n\sum_{d|i}\mu^2(d)\\&= ...

  9. 【异常】ORA-01536: space quota exceeded for tablespace

    ### The error may exist in /src/main/resources/com/star/css/dao/sql/workflow.xml ### The error may i ...

  10. 真刀真枪压测:基于TCPCopy的仿真压测方案

    郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19 关键词:压测.TCPCopy.仿真测试.实时拷贝流量 本文档适用人员:技术人员 提纲: 为什么要做仿真测试 ...