一个应用有一个进程,一个进程里可以用多个线程

1)定义

定义线程有两种方式,一是继承java.lang.Thread类,二是实现java.lang.Runnable接口。其实Thread类就是实现了Runnable接口的。

//方法一:继承Thread,并重写run()
public class OrdersThread extends Thread {
//该类实例化时并不会立即执行run(),而是在实例上调用start()才会执行
@Override
public void run() {
//需要线程执行的内容放在run方法
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
} //调用
public static void main(String[] args) {
OrdersThread ot=new OrdersThread();
//调用start()才真正开始线程
ot.start();
}

方法二:

//方法二实现接口Runnable
public class MyRunnable implements Runnable{ @Override
public void run() {
// 这里放需要执行的代码
}
} // 调用
public static void main(String[] args) {
MyRunnable ta = new MyRunnable();
//通过实现Runnable接口方式,需要使用Thread实现来启动
Thread thread1 = new Thread(ta);
thread1.start();
}

方法三:Runnable方式还可以通过匿名类的写法实现

public static void main(String[] args) {
//匿名类实现的方式,匿名类实现接口Runnable
Thread thread2=new Thread(new Runnable() {
@Override
public void run() {
//需要执行的代码
}
});
}

2)线程生命周期

Thread.sleep(毫秒值):进入休眠,单位毫秒。线程不会释放对象锁,不让出系统资源,占用着。直接使用Thread类调用sleep,不用实例。谁调用谁睡觉去,即使在当前线程调用别的线程的sleep,睡觉的不是当前线程,其他线程不受影响。sleep的唤醒要等时间到了自动醒过来,如果时间不到只能调用它的实例的interrupt()强行中断。

wait():也是等待,一般不需要指定时间,需要使用notify()/notifyAll()来唤醒。它跟sleep不同,wait是释放对象锁的,不占资源,一般是用到同步模块(synchronized)中去。如下面所示,也有多线程同步的写法;

public class MyRunnable implements Runnable {
private static String flag="";
@Override
public void run() {
//多线程同步
//这里可以定义一个变量,或者使用当前类this,或空格“” 都可以
synchronized (flag) {
//这里notify()是唤醒当前MyRunnable的上一个实例继承执行(上次实例中wait()后面的代码继承执行)
//这里notifyAll()是唤醒当前MyRunnable的【所有所有所有】实例中有wait()的实例继承执行
//只能在当前的run调用notity,其它地方行
flag.notify(); for (int i = 1000; i < 1100; i++) {
if (i == 1050) {
try {
System.out.println("MyRunnable暂停了");
flag.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(i);
}
}
}
}

3)线程加入

有两个线程A、B,在执行A时某一步骤时要先让B执行完后再继续执行A,可以使用join()

package com.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.lang.reflect.*; public class Main {
//定义未赋值的变量放在外面
private static Thread a;
private static Thread b;
public static void main(String[] args) {
a = new Thread(new Runnable() {
public void run() {
for (int i = 10; i < 20; i++) {
try {
Thread.sleep(100);
print(i);
if (i == 12) {
//到此处时,只有b完成后才会继续往下走
b.join();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
a.start(); b = new Thread(new Runnable() {
public void run() {
for (int i = 30; i < 40; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
print(i);
}
}
});
b.start();
}
}

4)线程中断

方法一:在线程继承类或实现Runnable接口的类里定义一个变量,然后在run()处判断该变量值为多少时就使用break;退出。该方法有限制,当线程里使用了sleep()或wait()后就无法退出了,此时应使用方法interrup()退出。

方法二:强行中断线程使用interrup(),调用线程的实例的interrup()方法,线程执行处就会抛出异常InterruptedException,使用try catch捕获使用break退出即可。

public class OrdersThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(i==5)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//只要在run()里使用try catch捕获InterruptedException异常,然后使用break处理并退出了
System.out.println("强行退出了");
break;
}
System.out.println(i);
}
}
}
OrdersThread t3=new OrdersThread();
t3.start();
t3.interrupt();//实例里强行退出

5)线程优先线

线程优先级有常数:1-10,默认为5

使用setPriority(1~10的整数)

OrdersThread t3=new OrdersThread();
//注意值的范围是1-8
t3.setPriority(8);
//也可以使用预先定义的枚举指定
//t3.setPriority(Thread.NORM_PRIORITY);
t3.setName("线程名称");//这里设置线程名称的写法
//最后才能start
t3.start();

6)线程同步

public class MyRunnable implements Runnable {
@Override
public void run() {
// Object可以是任何,一般是定义一个静态变量,或者当前类实例
synchronized (Object) {
// 需要步的代码
for (int i = 1000; i < 1100; i++) {
System.out.println(i);
}
} }
}

线程同步方法

//同步方法使用synchronized修饰
public synchronized String getName() {
return "";
}

5.JAVA语言基础部分—多线程的更多相关文章

  1. 我的学习目标(目前已初步学习完Java语言基础)

    操作系统.尤其是内存/线程/进程方面 计算机网络协议,重点关注 TCP/UDP/HTTP. 数据结构与算法. 数据库 设计模式,熟练掌握常用的几种设计模式. Java语言基础.熟悉java语言基础,了 ...

  2. 第二十六节:复习Java语言基础-Java的概述,匿名对象,封装,构造函数

    Java基础 Java语言概述 Java语言 语言 描述 javaee 企业版 javase 标准版 javame 小型版 JDK JDK(Java开发工具包) Java语言 语言 Java语言 Ja ...

  3. day01<计算机基础知识&Java语言基础>

    计算机基础知识(计算机概述) 计算机基础知识(软件开发和计算机语言概述) 计算机基础知识(人机交互) 计算机基础知识(键盘功能键和快捷键) 计算机基础知识(如何打开DOS控制台) 计算机基础知识(常见 ...

  4. 2018.6.13 Java语言基础复习总结

    Java语言基础与面向对象编程实践 第一章 初识Java 1.1机器语言 机器语言是指一台计算机全部的指令集合.机器语言室友0和1组成的二进制数,是一串串由0和1组成的指令序列,可将这些指令序列交给计 ...

  5. Java学习总结(二)----Java语言基础

    1.     Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,i ...

  6. java语言基础02

    一.Java语言基础(常量的概述和使用)(掌握) 1:什么是常量 就是在程序的执行过程中其值不发生改变的量. 2:Java中常量的分类 (1):字面值常量 (2):自定义常量(面向对象部分讲解) 3: ...

  7. Java之--Java语言基础组成—数组

    Java语言基础组成-数组 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的数组,数组 ...

  8. Java之--Java语言基础组成—函数

    Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...

  9. Java之--Java语言基础组成(关键字、标识符、注释、常量和变量、运算符)

    Java语言基础组成-关键字.标识符.注释.常量和变量.运算符 Java语言由8个模块构成,分别为:1.关键字:2.标识符(包名.类名.接口名.常量名.变量名等):3.注释:4.常量和变量:5.运算符 ...

随机推荐

  1. passive event 解决方法

    为了让页面滚动的效果如丝般顺滑,从 chrome56 开始,在 window.document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 pass ...

  2. js 一维数组转成tree 对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 几种优化web页面加载速度的策略

    剥离静态资源请求到CDN 一般在主域名下的HTTP请求里都会携带大量Cookie信息,最大4KB,每个域名下最多50条:但如果仅仅访问js/css/jpeg等静态资源文件的话是不需要Cookie信息, ...

  4. [LUOGU] P1908 逆序对

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为"逆序对"的 ...

  5. verdi知识点

    引用:http://blog.csdn.net/naclkcl9/article/details/5425936 1. verdi 加强了active anotation, active trace和 ...

  6. laravel如何利用数据库的形式发送通知

    具体实现需要分几步: 1.修改驱动为database; 2.创建database的queue表 3.创建任务sendMessage 4.创建发送逻辑dispatch 5.启动队列 接下来我们进行实操: ...

  7. python--第一类对象,函数名,变量名

    一 . 第一类对象 函数对象可以像变量一样进行赋值 , 还可以作为列表的元素进行使用 可以作为返回值返回 , 可以作为参数进行传递 def func(): def people(): print('金 ...

  8. PyCharm学习笔记(二) 调试配置

    选择PyCharm编译器 注意工程默认使用的解释器可能是Pycharm自带的,而不是单独安装的.

  9. python爬虫入门一:爬虫基本原理

    1. 什么是爬虫 爬虫就是请求网站并提取数据的自动化程序 2. 爬虫的基本流程 1)发送请求 通过HTTP库向目标站点发送请求,即发送一个Request. 请求可以包含额外的headers等信息,等待 ...

  10. LeetCode 673. Number of Longest Increasing Subsequence

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...