Concurrent programs are difficult to test and debug due to their non-deterministic execution. For deadlocks, traditional deadlock detection algorithms use lock graphs to find cycles, and do not address other types of deadlocks. This paper introduces not only lock-blocked relations but also wait-blocked and join-blocked relations for Java multi-threaded programs, and then proposes two types of deadlocks based on these blocked relations. One is cyclic and the other is acyclic. It also presents an example of implementation to detect these types of deadlocks, and addresses future directions.