zoukankan      html  css  js  c++  java
  • 线程浅析

    一、如何启动一个新的线程

    1、建立Runnable对象(线程的任务)
         因为Runnable是接口,所以需要一个类实现这个接口。其实就是覆盖里面的run()方法。
         示例:
         
    1 public class MyRunnable implements Runnable{
    2        public void run(){
    3               System.ou.println("这里放上的是需要执行的代码片段"):
    4        }
    5 }
    2、建立Thread对象(线程的执行工人)
    3、启动Thread。这时线程变成可执行的了,但还需等待JVM的调用才能变成“执行中”。
    示例: 
    1 Runnable runnable = new MyRunnable();
    2 Thread myThread = new Thread(runnable);
    3 myThread.start();
     
    二、线程的特
    1、会不断在“可执行”与“执行中”循环,线程调度器会做所有的决定,通常是公平的,但谁也无法保证某一个时刻执行的是哪个线程。
    2、线程不会重新启动,一旦该线程的run()方法完成之后,该线程就死了。只留下Thread对象呆在堆上,但已经完全失去了线程的可执行性,不能再次给他Thread.start()的调用。
     
    三、让线程小睡一下
    以下代码可以保证线程在两秒之内不会醒来(被执行),当然醒来之后也不一定会被执行。
    如果想要确保其他线程有执行的机会,就把线程放进睡眠状态。
    1 try{
    2     Thread.sleep(2000);
    3 }catch(InterruptedException ex){
    4     ex.printStackTrace();
    5 }
    四、测试线程
    比较好的办法:使用.setName()对每一个线程取自己的名字,执行的时候,利用Thread.currentThread().getName();来获取名字,并打印出来。
     
    五、处理并发问题
    1、举例线程中的并发问题:
    如果一个线程读到了某个数据后转入“可执行状态”,另一个线程修改了该数据。第一个线程醒来后继续使用原来的数据就会发生错误。
    2、如何解决:
    加锁。第一个线程读该数据时,就对该数据加锁。这样第二个线程就无法对该数据进行操作。只能第一个线程执行完毕后才解锁。
    3、给谁以及如何加锁?
      (1)锁不是配在方法上的,而是配在对象上的。(但我们加锁一般是加在方法上或者代码段上)如果一个对象有两个同步化的方法,那么表示两个线程无法进入同一个方法,也无法进入不同的方法(因为该对象只有一个锁,拿走了就没了)
      (2)给方法加锁:
    1  public sychronized void increment(){
    2         int i = balance;
    3         balance = i+1;
    4 } 
      (3)给代码块加锁:
    1 public void increment(){
    2        int i = balance;
    3        sychronized(this){
    4              balance = i+1;
    5        }
    6 }
    六、注意死锁
    七、静态变量的保护             
           静态变量是运行中在类上而不是实例上,除了对象,类也有自己的锁。如果你对静态的方法做同步化,Java会使用类本身的锁。

     

  • 相关阅读:
    求最大子数组和
    第四周学习进度
    四则运算3
    实用工具箱app开发日记5
    实用工具箱app开发日记4
    实用工具箱app开发日记3
    实用工具箱app开发日记2
    实用工具箱app开发日记1
    《软件需求与分析》阅读笔记
    软件需求分析--阅读笔记3
  • 原文地址:https://www.cnblogs.com/KevinHelloWorld/p/4109041.html
Copyright © 2011-2022 走看看