java线程学习1——线程基本概念和操作

 

一、创建线程的两种方式

 

1 继承Runnable接口

public class ThreadImpRunnable implements Runnable
{
 /**
  * 线程运行时执行的方法
  */
 public void run()
 {
  for (int i = 0; i < 500; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
  }
 }

}

 

public class Test
{
 /**
  * 主线程,启动线程必须是start方法
  */
 public static void main(String[] args)
 {
  ThreadImpRunnable tr = new ThreadImpRunnable();
  Thread t = new Thread(tr);
   t.start();

  for (int i = 0; i < 500; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
  }
 }
}

 

 

2 继承Thread类

public class ThreadExtends extends Thread
{
 /**
  * 线程运行时执行的方法
  */
 public void run()
 {
  for (int i = 0; i < 500; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
  }
 }

}

 

public class Test
{
 /**
  * 主线程,启动线程必须是start方法
  */
 public static void main(String[] args)
 {
  ThreadExtends tr = new ThreadExtends();
  tr.start();

  for (int i = 0; i < 500; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
  }
 }
}

 

 

 

二、线程的一些方法

1 sleep

public class SleepThread implements Runnable
{
 /**
  * 线程运行时执行的方法
  */
 public void run()
 {
  try
  {
   // 该线程进入阻塞状态5秒
   Thread.sleep(5000);
   for (int i = 0; i < 500; i++)
   {
    System.out.println(Thread.currentThread().getName() + i);
   }
  }
  catch (InterruptedException e)
  {
   // 若调用该线程的interrupt方法,会报该异常,真实程序中可以关闭一些资源
   e.printStackTrace();
  }
 }
}

 

public class SleepTest
{
 /**
  * 主线程
  */
 public static void main(String[] args)
 {
  SleepThread tr = new SleepThread();
  Thread t = new Thread(tr);
  t.start();
  for (int i = 0; i < 500; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
  }
 }
}

 

2 Join

public class JoinThread implements Runnable
{
 public void run()
 {
  for (int i = 0; i < 100; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
  }
 }
}

 

public class JoinTest
{
 public static void main(String[] args)
 {
  JoinThread jt = new JoinThread();
  Thread t = new Thread(jt);
  t.start();
  try
  {
   // 调用该方法将当前线程(此处是主线程)合并到本线程中,执行完本线程,再执行当前线程
   t.join();
  }
  catch (InterruptedException e)
  {
   e.printStackTrace();
  }
  for (int i = 0; i < 100; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
  }
 }

}

 

 

3 yield

public class YieldThread extends Thread
{
 public void run()
 {
  for (int i = 0; i < 100; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
   if (i % 10 == 0)
   {
    // 当能被10整除时本线程让出优先级,让其他线程先执行一会,可看到t1_10下面紧接着t2的结果,同样t2_20下面紧接着t1的结果
    yield();
   }
  }
 }
}

 

public class YieldTest
{
 public static void main(String[] args)
 {
  YieldThread yt = new YieldThread();
  Thread t1 = new Thread(yt, "t1_");
  t1.start();

  Thread t2 = new Thread(yt, "t2_");
  t2.start();
 }
}

 

4 setPriority

public class PriorityThread extends Thread
{
 public void run()
 {
  for (int i = 0; i < 100; i++)
  {
   System.out.println(Thread.currentThread().getName() + i);
  }
 }
}

 

public class PriorityTest
{
 /**
  * 线程优先级默认是5
  */
 public static void main(String[] args)
 {
  int norm = Thread.NORM_PRIORITY; // 5
  int max = Thread.MAX_PRIORITY;   // 10
  int min  = Thread.MIN_PRIORITY;  // 1

  PriorityThread yt = new PriorityThread();
  Thread t1 = new Thread(yt, "t1_");
  t1.setPriority(norm + 3);
  t1.start();

  Thread t2 = new Thread(yt, "t2_");
  t2.start();
 }
}

 

 

时间: 2024-09-23 03:13:10

java线程学习1——线程基本概念和操作的相关文章

java多线程学习之线程同步

基本上感觉自己学习的东西都是学会了立马就用,很少有机会能专门花时间去学习一些东西,近些时候不忙,准备把公司的面试题全做一遍,难的倒是不多,但是很多人都不会做,问题就是出在实践上. 言归正传.多线程就目前而言,纯是兴趣上的学习,并没有真实的应用场景.以前觉java多线程很乱,很多概念没似懂非懂,但是实战中写几个实例就一目了然了. 昨天练习线程安全时提到了synchronized关键字,其作用原理其实就是把一个或者一部份资源锁住,只允许当前这个进程使用.我理解线程同步就让各个线程之间能够控制资源的分

java线程学习6——线程同步之同步锁

  import java.util.concurrent.locks.ReentrantLock; public class Account {  /**   * 同步锁   */  private final ReentrantLock lock = new ReentrantLock();  /**   * 账户号   */  private String accountNo;  /**   * 账户余额   */  private double balance;  public Acco

java线程学习2——线程的生命周期

    该图摘自<疯狂的java讲义>,该书讲述的线程很详细.   其中新建状态和死亡状态的线程的isAlive属性均返回false,值得注意的是对死亡的线程调用start方法或 对新建的线程调用两次start 方法均会抛出illegalThreadStateException异常.  

java线程学习5——线程同步之同步方法

  public class Account {  /**   * 账户号   */  private String accountNo;  /**   * 账户余额   */  private double balance;  public Account()  {   super();  }  public Account(String accountNo, double balance)  {   super();   this.accountNo = accountNo;   this.

java线程学习4——线程同步之同步代码块

  模拟一个场景,两个人对同一个账户同时取钱   package cn.xy.Thread; public class Account {  /**   * 账户号   */  private String accountNo;  /**   * 账户余额   */  private double balance;  public Account()  {   super();  }  public Account(String accountNo, double balance)  {   s

java线程学习3——线程的停止

  方法一 stop方法 Thread t = new Thread(new MyThread()); t.stop();   非常不友好,该方法已经被废弃.使用该方法,线程直接停止,可能很多资源没有关闭,还有可能造成死锁.     方法二 interrupt方法 public class SleepThread implements Runnable {  /**   * 线程运行时执行的方法   */  public void run()  {   try   {    // 该线程进入阻塞

对象-Java基础学习遇见的问题

问题描述 Java基础学习遇见的问题 我是将自定义的对象,存储到了ArrayList集合中,出现下面错误,咋回事啊 多谢各位大神! 解决方案 19行的public拼错了少了b 解决方案二: ArrayList 里面应该加参数吧 ArrayList> list= new ArrayList>();这样定义试试 解决方案三: 黑马程序员 Java基础学习笔记 线程安全问题java基础问题01java基础问题18 解决方案四: 特殊词都带色的,,,拼错了色不对... 解决方案五: 用的什么开发工具啊

java学习日记(线程)

一.线程的概念: 线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制:但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈.所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程被称为轻负荷进程(light-weight process).一个进程中可以包含多个线程. 一个线程是一个程序内部的顺序控制流. 1. 进程:每个进程都有独立的代码和数据空间(进程上

java并发编程学习: 守护线程(Daemon Thread)

在正式理解这个概念前,先把 守护线程 与 守护进程 这二个极其相似的说法区分开,守护进程通常是为了防止某些应用因各种意外原因退出,而在后台独立运行的系统服务或应用程序. 比如:我们开发了一个邮件发送程序,一直不停的监视队列池,发现有待发送的邮件,就将其发送出去.如果这个程序挂了(或被人误操作关了),邮件就不发出去了,为了防止这种情况,再开发一个类似windows 系统服务的应用,常驻后台,监制这个邮件发送程序是否在运行,如果没运行,则自动将其启动.   而我们今天说的java中的守护线程(Dae