`

多线程笔记1

阅读更多

1 直接继承thread类,覆写RUN方法,启动调用的时候用start();
  package com.Thread;

class MyThread extends Thread{ // 继承Thread类,作为线程的实现类
 private String name ;  // 表示线程的名称
 public MyThread(String name){
  this.name = name ;  // 通过构造方法配置name属性
 }
 public void run(){ // 覆写run()方法,作为线程 的操作主体
  for(int i=0;i<10;i++){
   System.out.println(name + "运行,i = " + i) ;
  }
 }
};
public class ThreadDemo02{
 public static void main(String args[]){
  MyThread mt1 = new MyThread("线程A ") ;  // 实例化对象
  MyThread mt2 = new MyThread("线程B ") ;  // 实例化对象
  mt1.start() ; // 调用线程主体
  mt2.start() ; // 调用线程主体
 }
};

2 实现runnable接口的方法
 
class MyThread1 implements Runnable{ // 实现Runnable接口,作为线程的实现类
 private String name ;  // 表示线程的名称
 public MyThread1(String name){
  this.name = name ;  // 通过构造方法配置name属性
 }
 public void run(){ // 覆写run()方法,作为线程 的操作主体
  for(int i=0;i<10;i++){
   System.out.println(name + "运行,i = " + i) ;
  }
 }
};
public class RunnableDemo01{
 public static void main(String args[]){
  MyThread1 mt1 = new MyThread1("线程A ") ;  // 实例化对象
  MyThread1 mt2 = new MyThread1("线程B ") ;  // 实例化对象
  Thread t1 = new Thread(mt1) ;  // 实例化Thread类对象
  Thread t2 = new Thread(mt2) ;  // 实例化Thread类对象
  t1.start() ; // 启动多线程
  t2.start() ; // 启动多线程
 }
};

3 如果要实现资源的共享,则必须实现runnable方法
  class MyThread3 implements Runnable{ // 继承Thread类,作为线程的实现类
 private int ticket = 5 ;  // 表示一共有5张票
 public void run(){ // 覆写run()方法,作为线程 的操作主体
  for(int i=0;i<100;i++){
   if(this.ticket>0){
    System.out.println("卖票:ticket = " + ticket--) ;
   }
  }
 }
};
public class ShareResource {
 public static void main(String args[]){
  MyThread3 mt = new MyThread3() ;  // 实例化对象
  new Thread(mt).start() ; // 调用线程主体
  new Thread(mt).start() ; // 调用线程主体
  new Thread(mt).start() ; // 调用线程主体
 }
};

4 设置线程的名称
  class MyThread implements Runnable{ // 实现Runnable接口
 public void run(){ // 覆写run()方法
  for(int i=0;i<3;i++){
   System.out.println(Thread.currentThread().getName()
     + "运行,i = " + i) ; // 取得当前线程的名字
  }
 }
};
public class ThreadNameDemo{
 public static void main(String args[]){
  MyThread mt = new MyThread() ; // 实例化Runnable子类对象
  new Thread(mt).start() ;  // 系统自动设置线程名称
  new Thread(mt,"线程-A").start() ;  // 手工设置线程名称
  new Thread(mt,"线程-B").start() ;  // 手工设置线程名称
  new Thread(mt).start() ;  // 系统自动设置线程名称
  new Thread(mt).start() ;  // 系统自动设置线程名称
 }
};

5 JAVA运行时至少启动了两个线程,一个是MAIN,一个是垃圾收集线程
6 线程的强制运行
   class MyThread implements Runnable{ // 实现Runnable接口
 public void run(){ // 覆写run()方法
  for(int i=0;i<50;i++){
   System.out.println(Thread.currentThread().getName()
     + "运行,i = " + i) ; // 取得当前线程的名字
  }
 }
};
public class ThreadJoinDemo{
 public static void main(String args[]){
  MyThread mt = new MyThread() ; // 实例化Runnable子类对象
  Thread t = new Thread(mt,"线程");  // 实例化Thread对象
  t.start() ; // 启动线程
  for(int i=0;i<50;i++){
   if(i>10){
    try{
     t.join() ; // 线程强制运行
    }catch(InterruptedException e){}
   }
   System.out.println("Main线程运行 --> " + i) ;
  }
 }
};
输出:
线程运行,i = 0
Main线程运行 --> 0
线程运行,i = 1
Main线程运行 --> 1
线程运行,i = 2
Main线程运行 --> 2
线程运行,i = 3
Main线程运行 --> 3
线程运行,i = 4
线程运行,i = 5
Main线程运行 --> 4
线程运行,i = 6
Main线程运行 --> 5
线程运行,i = 7
Main线程运行 --> 6
线程运行,i = 8
Main线程运行 --> 7
线程运行,i = 9
Main线程运行 --> 8
线程运行,i = 10
Main线程运行 --> 9
Main线程运行 --> 10
线程运行,i = 11
线程运行,i = 12
线程运行,i = 13
 可以看到,当I>10时,主线程停了下来,让T强制运行。

7 后台线程
class MyThread implements Runnable{ // 实现Runnable接口
 public void run(){ // 覆写run()方法
  while(true){
   System.out.println(Thread.currentThread().getName() + "在运行。") ;
  }
 }
};
public class ThreadDaemonDemo{
 public static void main(String args[]){
  MyThread mt = new MyThread() ; // 实例化Runnable子类对象
  Thread t = new Thread(mt,"线程");  // 实例化Thread对象
  t.setDaemon(true) ; // 此线程在后台运行
  t.start() ; // 启动线程
 }
};

8 线程的优先级
   class MyThread implements Runnable{ // 实现Runnable接口
 public void run(){ // 覆写run()方法
  for(int i=0;i<5;i++){
   try{
     Thread.sleep(500) ; // 线程休眠
   }catch(InterruptedException e){}
   System.out.println(Thread.currentThread().getName()
     + "运行,i = " + i) ; // 取得当前线程的名字
  }
 }
};
public class ThreadPriorityDemo{
 public static void main(String args[]){
  Thread t1 = new Thread(new MyThread(),"线程A") ; // 实例化线程对象
  Thread t2 = new Thread(new MyThread(),"线程B") ; // 实例化线程对象
  Thread t3 = new Thread(new MyThread(),"线程C") ; // 实例化线程对象
  t1.setPriority(Thread.MIN_PRIORITY) ; // 优先级最低
  t2.setPriority(Thread.MAX_PRIORITY) ; // 优先级最低
  t3.setPriority(Thread.NORM_PRIORITY) ; // 优先级最低
  t1.start() ; // 启动线程
  t2.start() ; // 启动线程
  t3.start() ; // 启动线程
 }
};
9 线程的礼让
   class MyThread implements Runnable{ // 实现Runnable接口
 public void run(){ // 覆写run()方法
  for(int i=0;i<5;i++){
   try{
    Thread.sleep(500) ;
   }catch(Exception e){}
   System.out.println(Thread.currentThread().getName()
     + "运行,i = " + i) ; // 取得当前线程的名字
   if(i==2){
    System.out.print("线程礼让:") ;
    Thread.currentThread().yield() ; // 线程礼让
   }
  }
 }
};
public class ThreadYieldDemo{
 public static void main(String args[]){
  MyThread my = new MyThread() ; // 实例化MyThread对象
  Thread t1 = new Thread(my,"线程A") ;
  Thread t2 = new Thread(my,"线程B") ;
  t1.start() ;
  t2.start() ;
 }
};
10 同步:
  class MyThread implements Runnable{
 private int ticket = 5 ; // 假设一共有5张票
 public void run(){
  for(int i=0;i<100;i++){
   synchronized(this){ // 要对当前对象进行同步
    if(ticket>0){ // 还有票
     try{
      Thread.sleep(300) ; // 加入延迟
     }catch(InterruptedException e){
      e.printStackTrace() ;
     }
     System.out.println("卖票:ticket = " + ticket-- );
    }
   }
  }
 }
};
public class SyncDemo02{
 public static void main(String args[]){
  MyThread mt = new MyThread() ; // 定义线程对象
  Thread t1 = new Thread(mt) ; // 定义Thread对象
  Thread t2 = new Thread(mt) ; // 定义Thread对象
  Thread t3 = new Thread(mt) ; // 定义Thread对象
  t1.start() ;
  t2.start() ;
  t3.start() ;
 }
};

11 出现死锁的例子
   class Zhangsan{ // 定义张三类
 public void say(){
  System.out.println("张三对李四说:“你给我画,我就把书给你。”") ;
 }
 public void get(){
  System.out.println("张三得到画了。") ;
 }
};
class Lisi{ // 定义李四类
 public void say(){
  System.out.println("李四对张三说:“你给我书,我就把画给你”") ;
 }
 public void get(){
  System.out.println("李四得到书了。") ;
 }
};
public class ThreadDeadLock implements Runnable{
 private static Zhangsan zs = new Zhangsan() ;  // 实例化static型对象
 private static Lisi ls = new Lisi() ;  // 实例化static型对象
 private boolean flag = false ; // 声明标志位,判断那个先说话
 public void run(){ // 覆写run()方法
  if(flag){
   synchronized(zs){ // 同步张三
    zs.say() ;
    try{
     Thread.sleep(500) ;
    }catch(InterruptedException e){
     e.printStackTrace() ;
    }
    synchronized(ls){
     zs.get() ;
    }
   }
  }else{
   synchronized(ls){
    ls.say() ;
    try{
     Thread.sleep(500) ;
    }catch(InterruptedException e){
     e.printStackTrace() ;
    }
    synchronized(zs){
     ls.get() ;
    }
   }
  }
 }
 public static void main(String args[]){
  ThreadDeadLock t1 = new ThreadDeadLock() ;  // 控制张三
  ThreadDeadLock t2 = new ThreadDeadLock() ;  // 控制李四
  t1.flag = true ;
  t2.flag = false ;
  Thread thA = new Thread(t1) ;
  Thread thB = new Thread(t2) ;
  thA.start() ;
  thB.start() ;
 }
};

12 生产者消费者的情况描述例子:
package com.Thread;

class Info{ // 定义信息类
 private String name = "李兴华";  // 定义name属性
 private String content = "JAVA讲师"  ;  // 定义content属性
 public void setName(String name){
  this.name = name ;
 }
 public void setContent(String content){
  this.content = content ;
 }
 public String getName(){
  return this.name ;
 }
 public String getContent(){
  return this.content ;
 }
};
class Producer implements Runnable{ // 通过Runnable实现多线程
 private Info info = null ;  // 保存Info引用
 public Producer(Info info){
  this.info = info ;
 }
 public void run(){
  boolean flag = false ; // 定义标记位
  for(int i=0;i<50;i++){
   if(flag){
    this.info.setName("李兴华") ; // 设置名称
    try{
     Thread.sleep(90) ;
    }catch(InterruptedException e){
     e.printStackTrace() ;
    }
    this.info.setContent("JAVA讲师") ; // 设置内容
    flag = false ;
   }else{
    this.info.setName("mldn") ; // 设置名称
    try{
     Thread.sleep(90) ;
    }catch(InterruptedException e){
     e.printStackTrace() ;
    }
    this.info.setContent("www.mldnjava.cn") ; // 设置内容
    flag = true ;
   }
  }
 }
};
class Consumer implements Runnable{
 private Info info = null ;
 public Consumer(Info info){
  this.info = info ;
 }
 public void run(){
  for(int i=0;i<50;i++){
   try{
    Thread.sleep(90) ;
   }catch(InterruptedException e){
    e.printStackTrace() ;
   }
   System.out.println(this.info.getName() +
    " --> " + this.info.getContent()) ;
  }
 }
};
public class ThreadCaseDemo01{
 public static void main(String args[]){
  Info info = new Info(); // 实例化Info对象
  Producer pro = new Producer(info) ; // 生产者
  Consumer con = new Consumer(info) ; // 消费者
  new Thread(pro).start() ;
  new Thread(con).start() ;
 }
};
13 解决方法,等待与唤醒
    class Info{ // 定义信息类
 private String name = "李兴华";  // 定义name属性
 private String content = "JAVA讲师"  ;  // 定义content属性
 private boolean flag = false ; // 设置标志位
 public synchronized void set(String name,String content){
  if(!flag){
   try{
    super.wait() ;
   }catch(InterruptedException e){
    e.printStackTrace() ;
   }
  }
  this.setName(name) ; // 设置名称
  try{
   Thread.sleep(300) ;
  }catch(InterruptedException e){
   e.printStackTrace() ;
  }
  this.setContent(content) ; // 设置内容
  flag  = false ; // 改变标志位,表示可以取走
  super.notify() ;
 }
 public synchronized void get(){
  if(flag){
   try{
    super.wait() ;
   }catch(InterruptedException e){
    e.printStackTrace() ;
   }
  }
  try{
   Thread.sleep(300) ;
  }catch(InterruptedException e){
   e.printStackTrace() ;
  }
  System.out.println(this.getName() +
   " --> " + this.getContent()) ;
  flag  = true ; // 改变标志位,表示可以生产
  super.notify() ;
 }
 public void setName(String name){
  this.name = name ;
 }
 public void setContent(String content){
  this.content = content ;
 }
 public String getName(){
  return this.name ;
 }
 public String getContent(){
  return this.content ;
 }
};
class Producer implements Runnable{ // 通过Runnable实现多线程
 private Info info = null ;  // 保存Info引用
 public Producer(Info info){
  this.info = info ;
 }
 public void run(){
  boolean flag = false ; // 定义标记位
  for(int i=0;i<50;i++){
   if(flag){
    this.info.set("李兴华","JAVA讲师") ; // 设置名称
    flag = false ;
   }else{
    this.info.set("mldn","www.mldnjava.cn") ; // 设置名称
    flag = true ;
   }
  }
 }
};
class Consumer implements Runnable{
 private Info info = null ;
 public Consumer(Info info){
  this.info = info ;
 }
 public void run(){
  for(int i=0;i<50;i++){
   this.info.get() ;
  }
 }
};
public class ThreadCaseDemo03{
 public static void main(String args[]){
  Info info = new Info(); // 实例化Info对象
  Producer pro = new Producer(info) ; // 生产者
  Consumer con = new Consumer(info) ; // 消费者
  new Thread(pro).start() ;
  new Thread(con).start() ;
 }
};
  

0
0
分享到:
评论

相关推荐

    马士兵多线程笔记.zip

    以下是对马士兵多线程笔记的详细解析。 1. **多线程基础**:多线程是指一个应用程序中同时执行多个线程(即任务)的能力。这种并发执行可以提高系统资源的利用率,提升程序的响应速度和执行效率,特别是在多核...

    Java多线程笔记

    Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,...

    马士兵多线程训练营笔记

    马士兵是一位知名的IT教育专家,他的多线程训练营笔记深入浅出地讲解了这一主题,帮助开发者理解并掌握多线程的精髓。 多线程允许一个程序中有多个执行流同时运行,这样可以提高应用程序的效率和响应性。在Java中,...

    java多线程笔记

    Java线程的知识点总结。doc

    多线程学习笔记

    多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    多线程笔记.md

    多线程笔记

    张孝祥Java多线程与并发库高级应用笔记

    ### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...

    java多线程笔记全手打

    通过阅读`多线程笔记.doc`和运行`threadDemo`示例代码,你可以对Java多线程有更深入的理解,并能够在实际项目中灵活运用这些知识,解决并发问题。同时,博客地址提供了更多详细内容,可以帮助你进一步探索和实践。

    C# 多线程笔记和示例讲解

    以下是对"C#多线程笔记"中可能包含的知识点的详细解释。 1. **线程基础**: - **什么是线程**:线程是程序执行的最小单元,每个进程至少有一个线程,负责执行程序代码。 - **主线程与子线程**:主线程是程序的...

    C#多线程笔记

    ### C#多线程知识点详解 #### 一、线程与窗体间的交互 在C#编程中,每个窗体通常都运行在一个独立的线程上。这意味着如果一个应用程序包含多个窗体,那么这些窗体将分别运行在各自的线程之上。当需要实现不同窗体...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    java多线程笔记分享

    java多线程笔记分享

    多线程笔记

    ### 多线程基础知识与应用 #### 一、线程的创建方式 在Java中,创建线程主要有两种方式:一种是通过继承`Thread`类;另一种是通过实现`Runnable`接口。 1. **继承Thread类** ```java public class MyThread ...

    Python3 多线程笔记

    ### Python3多线程知识点详解 #### 一、线程基础 **线程状态** 在探讨Python3中的多线程之前,我们首先需要理解线程的基本状态及其转换过程。 - **新建**: 当一个线程被创建后,它最初处于新建状态。 - **就绪**...

    多线程训练营资料1.xls.md

    根据提供的文件信息,可以看出这份资料主要关注的是Java中与多线程相关的高级同步机制,特别是CAS(Compare and Swap)操作、自旋锁以及Unsafe类的使用。下面将详细阐述这些概念及其应用场景。 ### CAS (Compare ...

    java学习笔记2(多线程)

    java学习笔记2(多线程)java学习笔记2(多线程)

    多线程笔记.docx

    Java多线程是Java编程中不可或缺的部分,它允许程序同时执行多个任务,从而提升程序的效率和CPU的利用率。在Java中,线程是程序执行的最小单位,而进程则是资源分配的基本单位。一个进程可以包含一个或多个线程,...

    C#多线程笔记学习指南

    本篇笔记将深入探讨C#多线程的基本概念、操作方法以及注意事项。 首先,我们要理解多线程的基本概念。线程是程序执行的最小单位,每个线程都有自己的执行路径和栈空间,但它们共享同一块堆内存。因此,线程间的通信...

Global site tag (gtag.js) - Google Analytics