1.介绍

线程可以使程序具有两条和两条以上的可运行的路径。尤其对多核CPU特别的重要。

2.创建线程

1.继承Thread类

一个类直接的继承Thread类的话,此类就具有了线程的能力,接下来仅仅须要重写继承的run()就可以。

<span style="font-size:18px;">package com.Thread;

//定义实现Runnable接口的类
class MyThread11 extends Thread
{
//实现run方法。指定线程运行的任务
public void run()
{ System.out.println("启动一个线程!");
}
}
//主类
public class Sample16_2
{
public static void main(String[] args)
{
//继承Thread的类创建线程对象 Thread t=new MyThread11();
//启动线程
t.start();
System.out.println("启用线程了");
}
}
</span>

2.实现Runnable接口

java採用的单继承,假设採用继承Thread类的话,会有非常多限制,因此常常採用的是继承Runnable接口来实现线程的创建。

<span style="font-size:18px;">package com.Thread;

//定义实现Runnable接口的类
class MyRunnable implements Runnable
{
//实现run方法。指定线程运行的任务
public void run()
{ System.out.println("恭喜你。线程被启动了,"
+"运行了run方法中的代码! 。。");
}
}
//主类
public class Sample16_1
{
public static void main(String[] args)
{
//创建实现Runnable接口的类的对象
MyRunnable mr=new MyRunnable();
//创建Thread对象,将第一步创建对象的引用作为构造器參数
//传递,指定线程要运行的任务
Thread t=new Thread(mr);
//启动线程
t.start();
System.out.println("启用线程了");
}
}
</span>

3.线程的同步

1.同步方法

同步方法是指使用synchronizedkeyword修饰的方法,进入同步方法运行的线程将获得同步方法所属对象的锁,一旦锁住。仅仅有该线程运行完,其它线程才干运行。因此保证了方法同步的安全性。

<span style="font-size:18px;">package com.Thread;
//资源类
class Resource
{
synchronized void function1(Thread currThread)
{
System.out.println(currThread.getName()+
"线程运行function1方法。! !");
try
{
Thread.sleep(1000);
System.out.println(currThread.getName()
+"线程睡醒了! ! ! ");
}
catch(Exception e)
{
e.printStackTrace();
}
}
synchronized void function2(Thread currThread)
{
System.out.println(currThread.getName()+
"线程运行function2方法!! !");
}
}
//自己定义线程类
class MyThread00 extends Thread
{
//资源对象的引用
Resource rs;
//构造器
public MyThread00(String tName,Resource rs)
{
this.setName(tName);
this.rs=rs;
}
public void run()
{
if(this.getName().equals("Thread1"))
{//假设线程名称是Thread1訪问资源的function1方法
rs.function1(this);
}
else
{//假设线程名称不是Thread1訪问资源的function2方法
System.out.println("Thread2启动。等待进入同步方法function2。。!");
rs.function2(this);
}
}
}
//主类
public class Sample16_8
{
public static void main(String args[])
{
Resource rs=new Resource();
MyThread00 t1=new MyThread00("Thread1",rs);
MyThread00 t2=new MyThread00("Thread2",rs);
t1.start();
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
t2.start();
}
}
</span>

注意:一个对象能够有同步和非同步方法,仅仅有进入同步方法运行才须要获得锁。每一个对象仅仅有一把锁;若一个对象有多个同步的方法,当某线程訪问当中之中的一个的时候。其它线程不能訪问该对象重点额不论什么同步方法。若线程获得锁后进入睡眠或让步,则将带着锁一块睡眠或让步。

2.同步语句块

使用同步语句块能够提高程序的并发性,能够精确的确定同步的区域。

<span style="font-size:18px;">package com.Thread;

//自己定义的线程类
class MyThread33 extends Thread
{
//该引用为资源对象
private Object resource;
//无參构造器
public MyThread33()
{}
//有參构造器
public MyThread33(Object resource,String name)
{
//对线程进行初始化
this.resource=resource;
this.setName(name);
}
public void run()
{
//同步语句块
synchronized(resource)
{
System.out.println(this.getName()
+"线程訪问了资源! !。");
System.out.println(this.getName()
+"线程带着锁睡觉去了! !。");
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(this.getName()
+"线程带着锁睡醒后释放了锁!!! ");
}
}
}
//主类
public class Sample16_10
{
public static void main(String[] args)
{
//创建资源对象
Object resource=new Object();
//创建2个线程
MyThread33 mt1=new MyThread33(resource,"MT1");
MyThread33 mt2=new MyThread33(resource,"MT2");
//启动这2个线程
mt1.start();
mt2.start();
}
}
</span>

注意:当中synchronized(XXX),XXX代表的是资源对象的引用。

4.线程的其它设置

1.线程的优先级

java中线程的优先级用1到10之间的整数表示,数值越大优先级越高。获得訪问CPU的机会越大。一般採用setPriority方法来设置。

<span style="font-size:18px;">package com.Thread;

//定义继承Thread的类
class MyThread1 extends Thread {
// 重写run方法,指定该线程运行的代码
public void run() {
for (int i = 0; i <= 49; i++) {
System.out.print("<Min" + i + "> ");
}
}
} // 定义另外一个继承Thread的类
class MyThread2 extends Thread {
// 重写run方法,指定该线程运行的代码
public void run() {
for (int i = 0; i <= 49; i++) {
System.out.print("[Max" + i + "] ");
}
}
} // 主类
public class Sample16_4 {
public static void main(String[] args) {
// 创建两个线程对象
MyThread1 t1 = new MyThread1();
MyThread2 t2 = new MyThread2();
// 设置两个线程的优先级
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.MAX_PRIORITY);
// 启动两个线程
t1.start();
t2.start(); }
}
</span>

2.线程的让步

在实际开发中有时候也须要让某线程让出CPU。使其它线程得意运行。这时候能够採用让步的操作。

一般调用yield方法。

<span style="font-size:18px;">package com.Thread;

//定义Runnable的实现类
class MyRunnable1 implements Runnable
{
//声明标识线程的两个字符串
private String flagl;
private String flagr;
//MyRunnable的构造器
public MyRunnable1(String flagl,String flagr)
{
//初始化标识字符串
this.flagl=flagl;
this.flagr=flagr;
}
//重写run方法,指定该线程运行的代码
public void run()
{
for(int i=0;i<30;i++)
{
System.out.print(flagl+i+flagr);
//调用yield方法使当前正在运行的线程让步
Thread.yield();
}
}
}
//主类
public class Sample16_5
{
public static void main(String[] args)
{
//创建两个实现Runnable接口的类的对象
MyRunnable1 mr1=new MyRunnable1("[","] ");
MyRunnable1 mr2=new MyRunnable1("<","> ");
//创建两个线程Thread对象,并指定运行的target
Thread t1=new Thread(mr1);
Thread t2=new Thread(mr2);
//启动线程t1、t2
t1.start();
t2.start();
}
}
</span>

5.总结

本篇文章简单的总结了线程中的一些概念,可是这些概念是以后开发高级线程必备的知识,须要多理解。

Java学习笔记五(多线程)的更多相关文章

  1. 【原】Java学习笔记032 - 多线程

    package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * [进程]:正在 ...

  2. Java学习笔记:多线程(一)

    Java中线程的五种状态: 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked) 凋亡状态(Dead) 其中阻塞状态(Blocked)又分为三种: ...

  3. Java学习笔记之——多线程

    多线程编程 程序: 进程:一个程序运行就会产生一个进程 线程:进程的执行流程,一个进程至少有一个线程,称为主线程 如:QQ聊着天,同时在听音乐 一个进程可以有多个线程,多个线程共享同一个进程的资源 线 ...

  4. Java学习笔记五:Java中常用的运算符

    Java中常用的运算符 运算符是一种“功能”符号,用以通知 Java 进行相关的运算.譬如,我们需要将变量 score 的值设置为 20 ,这时候就需要一个“=”,告诉程序需要进行赋值操作. Java ...

  5. Java学习笔记五--String(二)String其他方法

    第一节课 // 清除单位字符串开始和结尾空白的副本 String.trim(); 字符串每次更改都会创建新的对象,而不会覆盖原来的字符串,每次拼接都会产生新的String对象,耗时耗内存. java. ...

  6. java学习笔记(5)多线程

    一.简介(过段时间再写,多线程难度有点大) --------------------------------------- 1.进程:运行时的概念,运行的应用程序 2.线程:应用程序内部并发执行的代码 ...

  7. Java 学习笔记(11)——多线程

    Java内部提供了针对多线程的支持,线程是CPU执行的最小单位,在多核CPU中使用多线程,能够做到多个任务并行执行,提高效率. 使用多线程的方法 创建Thread类的子类,并重写run方法,在需要启动 ...

  8. Java学习笔记五——流程控制

    分支结构 Java提供了两种常见的分支控制结构:if语句和switch语句. if语句 if语句使用布尔值或布尔表达式(表达式结果为布尔值),if语句有3中形式: 第一种形式: if (5 > ...

  9. Java 学习笔记 (五) Java Compile\Build\Make的区别

    以下内容引自: http://blog.51cto.com/lavasoft/436216 Compile.Make和Build的区别 原创leizhimin2010-11-30 11:30:20评论 ...

随机推荐

  1. How to check Ubuntu version

    Below you can find some tips on how to check Ubuntu version you are currently running. The first pla ...

  2. c#开发地磅称重软件

    2012年时即做过一个地磅称重软件,最近公司又接了一个地磅过磅软件的项目,把遇到的问题总结一下以备后用. 1.接线问题 因为客户方原来单独使用仪表,仪表未有接线和电脑连接,为此颇费周折才做好了接线.接 ...

  3. Maven最佳实践:Maven仓库

    什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文 件,如log4j.jar,junit. ...

  4. word排版汇总

    1.iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf 的文档,而且可以将XML.Html文件转化为PDF ...

  5. 【ContestHunter】【弱省胡策】【Round5】

    反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...

  6. 我所遭遇过的游戏中间件---Redux

    我所遭遇过的游戏中间件---Redux 一.关于Redux Substance Redux 是一款纹理处理软件加中间件,专门用于纹理生成和压缩.具其用户指南介绍,它能够对纹理集进行优化,可以将现有压缩 ...

  7. 充满未来和科幻的界面设计FUI在国内还没有起步在国外早起相当成熟

    所谓FUI可以是幻想界面(Fantasy User Interfaces).科幻界面(Fictional User Interfaces).假界面(Fake User Interfaces).未来主义 ...

  8. nth-digit

    https://leetcode.com/problems/nth-digit/ public class Solution { public int findNthDigit(int n) { in ...

  9. fdisk 分区格式化为ext4格式分区

    第一步:添加硬盘/新建分区(fdisk) 第二步:格式化分区(mkfs.ext4) 第三步:加载分区(mount) 1.第一步:添加硬盘/新建分区(fdisk) a.查看当前系统所有硬盘及分区情况:f ...

  10. Android中Dialog对话框的调用及监听

    Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter, ...