线程的基础知识

1.synchro关键字的用法
2.同步和异步的区别
3.启动一个线程是run还是start
相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!
等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。
5.线程的基本状态和状态之间的关系
第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
  
第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,
但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。
在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
 
 第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,
此时线程就进入了运行状态,开始运行run函数当中的代码。
  
第四是阻塞状态。线程正在运行的时候,被暂停,
通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。
sleep,suspend,wait等方法都可以导致线程阻塞。
 
 第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,
该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
6.lock和sync的区别
在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,
而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。
所以线程是程序执行流的最小单位,
而进程是系统进行资源分配和调度的一个独立单位。以下我们所有讨论的都是建立在线程基础之上。
7.线程和进程的区别
8.runnable和callable的区别
相同点:
两者都是接口;(废话)
两者都可用来编写多线程程序;
两者都需要调用Thread.start()启动线程;
不同点:
两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;
Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛

9.什么是线程安全
存在竞争的线程不安全,不存在竞争的线程就是安全的
11.如何在两个线程之间共享数据
如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象有那个共享数据,例如,买票系统就可以这么做
12.如何避免死锁
设置加锁顺序,时限
13.活锁和死锁的区别
就是指线程一直处于运行状态,但却是在做无用功,而这个线程本身要完成的任务却一直无法进展。就想小猫追着自己的尾巴咬,虽然一直在咬

15.如何保证多个线程按顺序执行
通过thread的join方法保证多线程的顺序执行, wait是让主线程等待
16.List,set,Map是否继承自Collection接口
List<Map<String, Object>> acNoMapList=(List<Map<String, Object>>)
map.get(“List”);

List,Set,Map是否继承自Collection接口?

答:List,Set是,Map不是。

如图:

  Collection 

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。

注意:Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射。

详细介绍:
List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低
Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)
Query接口有一个实现类:LinkList
Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null
SortedMap有一个实现类:TreeMap
其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是知道的,存储的是键值对
set 一般无序不重复.map kv 结构 list 有序

就个人而言.list 用的比较多. 其次map 最后set 至于什么情况下使用什么集合.看情况了. 也不好说.也没那么绝对.
看了下面的这个就更容易明白了
写一段代码,遍历一个List中的元素
List、Map、Set三个接口,存取元素时,各有什么特点?

import java.util.*;

public class Test

{

public static void main(String [] arge)

{

List list = new ArrayList();

list.add(0, “a”);

list.add(1, “b”);

list.add(2, “c”);

list.add(3, “d”);

while(Iterator it = list.iterator();it.hasNext())

{

Object element = it.next();

System.out.println (element);

}

}

}

List、Map、Set

List 通过下标来存取 和值来存取

Map 键值对应来存取

set 存取元素是无序的


package com.operation;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;

import java.util.Set;

import java.util.TreeSet;

public class User {

private Integer userId;

private String userName;

private String address;

public User(int userId, String userName, String address) {

this.userId = userId;

this.userName = userName;

this.address = address;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public Integer getUserId() {

return userId;

}

public void setUserId(Integer userId) {

this.userId = userId;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public static void main(String[] args) {

// Map<Integer, User> map = new TreeMap<Integer, User>();

// map.put(1, new User(1,“李伟”,“beijing”));

// map.put(2, new User(2,“王文军”,“beijing”));

//

// map.put(4, new User(2,“abc”,“beijing”));

// map.put(5, new User(2,“abc”,“beijing”));

//

//

//

// Set keys = map.keySet();

//

//// Iterator it = keys.iterator();

//// while (it.hasNext()) {

//// Integer key = it.next();

//// User user = map.get(key);

//// System.out.println("key = " + key + “\t” + "value = " + user.getUserName());

//// }

//

// for (Integer key : keys) {

// User user1 = map.get(key);

// System.out.println("key = " + key + “\t” + "value = " + user1.getUserName());

// }

Set set = new HashSet();

set.add(“a”);

set.add(“b”);

set.add(“c”);

set.add(“d”);

set.add(“d”);

set.add(“d”);

set.add(“d”);

set.add(“uuu”);

set.add(“e”);

Iterator it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

}

}

猜你喜欢

转载自blog.csdn.net/weixin_37565521/article/details/84857018