对java多线程的理解

 

在理解多线程之前我们要理解进程和线程:

进程指每个独立程序在计算机上的一次执行活动,例如QQ360管家

线程就是一个程序内部的一条执行路径,如果一个程序中可以同一时间执行多个线程,我们就说这个程序是支持多线程的;比如迅雷下载软件可以同时下载多个任务。

什么事多线程?

多线程可以理解成多任务,一个程序在同一时间内执行多个任务,每个任务通常可以理解成一个线程,这种能执行多个线程的程序称之为多线程程序。

为什么需要多线程?

多线程作为一种多任务并发的工作方式,具有以下特点:

提高应用程序响应

提高计算机CPU的利用率

改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

线程状态:新建、可运行、阻塞、等待、中止等,如图:

 

 

创建新线程的方式:

继承Thread类  2.实现Runnable接口

声明线程:

单线程:Thread 线程名 = new Thread(new 线程类());

 多线程: 

             线程类  对象名A=new 线程类();

             Thread 线程名1=new Thread(对象名A);

             Thread 线程名2=new Thread(对象名A);

 

代码如下:

/**

 * 

 * 实现Runnable接口创建线程

 *

 */

public class FirstThread implements Runnable {

public void run() {

//要在线程中执行的代码

for(int i=0;i<100;i++){

System.out.println(Thread.currentThread().getName()+"MyRunnable:"+i);

}

}

}

/**

 * 继承Thread创建线程

 */

/*public class FirstThread extends Thread(){

public void run(){

//要在线程中执行的代码

for(int i=0;i<100;i++){

System.out.println("MyThread:"+i);

}

}*/

public class FirstThreadTest {

/**

 * 创建和启动多个线程

 */

public static void main(String[] args) {

System.out.println("主线程开始执行。。。。");

/* 声明线程1 */

Thread t1 = new Thread(new FirstThread());

/* 启用线程 */

t1.start();

Thread t2 = new Thread(new FirstThread());

t2.start();

}

}

 

 

1.  线程睡眠:

/**

 * 

 * 线程睡眠:

 * 1.线程体中调用sleep()方法使当前线程进入睡眠状态,调用sleep()方法

 * 需要传入一个毫秒数作为当前线程的睡眠时间,线程睡眠相应的时间便会苏醒,

 * 重新进入可执行状态

 * 2.在实际案例开发中,为了调整各个子线程的执行顺序,可以通过

 * 线程睡眠的方式来完成

 *

 */

public class ThreadSleep implements Runnable {

public void run() {

try {

Thread.sleep(100);//让线程睡100毫秒

} catch (InterruptedException e) {

e.printStackTrace();

}

for(int i=0;i<100;i++){

          System.out.println(Thread.currentThread().getName()+"    "+i);

}

}

}

public class ThreadSleepTest {

/**

 * 线程睡眠测试

 */

public static void main(String[] args) {

System.out.println("主线程执行。。。");

//声明线程

Thread t1=new Thread(new ThreadSleep());

//启用线程

t1.start();

Thread t2=new Thread(new ThreadSleep());

t2.start();

}

}

//问题:打印出很多重复的数字。。。

 

 

2. 线程让步:

 

/**

 * 

 * Thread.yield()方法会暂停当前正在执行的线程对象,把执行机会

 * 让给相同或更高优先级的线程。

 *

 */

public class ThreadYield implements Runnable {

public void run() {

for(int i=0;i<100;i++){

System.out.println(Thread.currentThread().getName()+": "+i);

if(i%10==0){//i能被10整除时,当前线程让步给其他线程

Thread.yield();

}

}

}

}

public class ThreadYieldTest {

/**

 * 线程让步测试

 */

public static void main(String[] args) {

Thread t1=new Thread(new ThreadYield());

t1.start();

Thread t2=new Thread(new ThreadYield());

        t2.start();

}

}

3. 线程的加入:

/**

 * 

 * 线程的加入:

 * 有时需要线程间的接力来完成某项任务,这需要调用线程类jion()方法,jion()方法

 * 可以使两个交叉执行的线程编程顺序执行。

 * 注:A线程加入到B线程中,等A线程执行完了B线程才会拿到执行权开始执行。

 * (Jion谁就是要等谁执行结束)

 *

 */

public class ThreadJion implements Runnable {

public void run() {

for(int i=0;i<=20;i++){

System.out.println(Thread.currentThread().getName()+":"+i);

  

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

    

}

}

}

public class ThreadJionTest {

/**

 * 线程的加入测试类

 */

public static void main(String[] args) {

          Thread t1=new Thread(new ThreadJion());

          t1.start();

          

          /*主线程执行for循环*/

          for(int i=1;i<=50;i++){

           System.out.println(Thread.currentThread().getName()+":  "+i);

           if(i==30){

           try {

t1.join();  //把子线程加入到主线程执行

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

           }

          }

}

}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值